总结:您的代码运行正常,可以插入日期和时间组件。问题在于当您查询数据库时,只显示日期组件而不显示时间组件。您需要更改在
SELECT
语句中显示日期的方式,而不是更改
INSERT
语句。
存储日期和时间
我的问题是它只插入了日期(dd/mon/yy),但没有插入时间。我该如何使其同时插入时间?
在Oracle中,DATE
是一个由7个字节组成的二进制数据类型,表示世纪、年份、月份、日期、小时、分钟和秒。它始终存储这7个字节,而不以任何特定的人类可读格式存储。
因此,当您使用以下查询时:
INSERT INTO WORKON (
STAFFNO,
CAMPAIGNTITLE,
DATETIME,
HOURS
) VALUES (
'102',
'Machanic Summer Savings',
TO_DATE('22/April/2011 8:30:00AM','DD/MON/YY HH:MI:SSAM'),
'3'
);
然后它在数据库中
存储日期和时间组件。
如果您想查看二进制值,可以使用
DUMP
函数:
SELECT DUMP(datetime) FROM workon;
DUMP(DATETIME) |
Typ=12 Len=7: 120,111,4,22,9,31,1 |
这表明有7个字节都有值,所以日期和时间组件都已经存储在数据库中。
存储日期和时间的替代方法
你的代码可以工作,但还有几种其他方法可以使用:
你可以改进你的代码,使用与数据相关的格式模型(例如,使用
MONTH
而不是
MON
,使用
YYYY
而不是
YY
,以及使用
HH12
来表示使用12小时制的时间,而不是
HH
),并明确设置你期望接收到的字符串的语言(否则,如果你继续传递英文月份,但用户将会话更改为例如
NLS_DATE_LANGUAGE=French
),你的代码可能会出错):
INSERT INTO WORKON (
STAFFNO,
CAMPAIGNTITLE,
DATETIME,
HOURS
) VALUES (
'102',
'Machanic Summer Savings',
TO_DATE(
'22/April/2011 8:30:00AM',
'DD/MONTH/YYYY HH12:MI:SSAM',
'NLS_DATE_LANGUAGE=English'
),
'3'
);
你可以使用
DATE
和
INTERVAL DAY TO SECOND
字面量:
INSERT INTO WORKON (
STAFFNO,
CAMPAIGNTITLE,
DATETIME,
HOURS
) VALUES (
'102',
'Machanic Summer Savings',
DATE '2011-04-22' + INTERVAL '08:30:00' HOUR TO SECOND,
'3'
);
你可以使用
TIMESTAMP
字面量(数据库会隐式将其转换为与列的数据类型匹配的
DATE
):
INSERT INTO WORKON (
STAFFNO,
CAMPAIGNTITLE,
DATETIME,
HOURS
) VALUES (
'102',
'Machanic Summer Savings',
TIMESTAMP '2011-04-22 08:30:00',
'3'
);
显示日期和时间
我怎样才能让它同时插入时间呢?
它正在插入日期的时间部分;你的问题稍有不同,因为该值被存储了,但在查询表时没有被显示出来。
当你执行以下操作时:
SELECT * FROM workon;
然后数据库将以二进制值的形式将您用于查询数据库的客户端应用程序(如SQL*Plus、SQL Developer、Java、PHP等)发送给您,然后由客户端应用程序选择如何以对您有意义的方式显示该二进制值。
某些客户端应用程序将显示日期和时间组件。其他一些应用程序,如SQL*Plus、SQL Developer和SQLCl,将使用数据库的NLS_DATE_FORMAT作为默认格式来显示日期;默认的NLS_DATE_FORMAT取决于您所在的地区,但Oracle在全球使用的所有默认格式模型的共同主题是它们只显示日期的年、月和日组件,而不显示时间组件。(您可以问问Oracle为什么选择这些默认值而不显示所有内容。)
为了解决显示问题,您可以选择以下方法之一:
1. 使用
TO_CHAR
明确格式化
DATE
:
SELECT staffno,
campaigntitle,
TO_CHAR(datetime, 'YYYY-MM-DD HH24:MI:SS') AS datetime,
hours
FROM workon;
2. 更改客户端应用程序的首选项。请参考您所使用的客户端应用程序的文档,了解如何进行更改;对于SQL Developer,您可以参考问题
SQL Developer is returning only the date, not the time. How do I fix this?中的答案。
3. 如果您的客户端应用程序使用
NLS_DATE_FORMAT
会话参数作为默认日期显示方式,则可以更改会话参数:
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
这将更改数据库用于处理
所有日期到字符串和字符串到日期的隐式转换的格式模型,并且这些客户端应用程序也会更改日期的格式。
小提琴
DESC WORKON
- ring bearer