如何在Oracle中插入日期和时间?

54

我在插入表格行时遇到了问题。这是插入语句和表格创建的部分。这是我的大学作业,所以很简单,我做错了什么?我正在使用Oracle SQL Developer Version 3.0.04。

我遇到的问题是它只插入了dd/mon/yy而没有时间。如何使它也插入时间?

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')
;

CREATE TABLE WorkOn
(
    StaffNo        NCHAR(4),
    CampaignTitle  VARCHAR(50),
    DateTime       DATE,
    Hours          VARCHAR(2)
)
;

感谢您的帮助。

编辑:这毫无意义,我只是在输入一个时间来测试时间是否正常工作,它输出了一个日期?这真的很奇怪,我可能不会使用日期字段,只需输入时间即可。我意识到这将导致操作数据时出现问题,但这没有任何意义...


请分享您的表定义 - DESC WORKON - ring bearer
6个回答

69

您可以使用

insert into table_name
(date_field)
values
(TO_DATE('2003/05/03 21:02:44', 'yyyy/mm/dd hh24:mi:ss'));

希望这能帮到你。


43

您正在正确地使用 to_date 函数并指定时间。时间已经在数据库中存在。问题只是当您从数据库选择 DATE 数据类型的列时,默认格式掩码不显示时间。如果您使用以下命令或类似包含时间组件的命令:

alter session set nls_date_format = 'dd/MON/yyyy hh24:mi:ss'

您将会看到时间成功进入了数据库。


哦,谢谢你,只有一个最后的问题,它设置了所有日期格式化列的格式,导致在我只想要日期显示的列中显示时间。是否可以为特定表指定它? - Deep
1
然后您需要在选择语句中指定日期格式掩码。类似于“select to_char(datetime,'dd-mm-yyyy hh24:mi:ss') datetime from workon”。 - Rob van Wijk
这个“alter session”命令真是太好用了(我完全是Oracle的新手)。谢谢Rob。 - Vinny Roe

9
尝试这样做:

...(to_date('2011/04/22 08:30:00', 'yyyy/mm/dd hh24:mi:ss'));

(该代码段涉及日期格式转换,具体细节请查看相关IT技术文档)

抱歉,我打错了,请再试一次。 - jschorr
嗨,它仍然无法正常工作,它只插入日期部分并忽略时间。如果我只输入时间,则会将其转换为日期...对我来说,MySQL比Oracle更有意义... - Deep
1
你确定该字段是一个DateTime类型吗?现在听起来像是一个Date类型的字段。执行以下操作以查看:DESC WORKON - jschorr

6

只需使用TO_DATE()函数将字符串转换为DATE

例如:

create table Customer(
       CustId int primary key,
       CustName varchar(20),
       DOB date);

insert into Customer values(1,'Vishnu', TO_DATE('1994/12/16 12:00:00', 'yyyy/mm/dd hh:mi:ss'));

2
create table Customer(
       CustId int primary key,
       CustName varchar(20),
       DOB date);

insert into Customer values(1,'kingle', TO_DATE('1994-12-16 12:00:00', 'yyyy-MM-dd hh:mi:ss'));

1
请不要仅仅发布代码作为答案,还要提供解释您的代码是如何解决问题的。带有解释的答案通常质量更高,更有可能吸引赞同。 - Mark Rotteveel

0
总结:您的代码运行正常,可以插入日期和时间组件。问题在于当您查询数据库时,只显示日期组件而不显示时间组件。您需要更改在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'
);

你可以使用DATEINTERVAL 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';
这将更改数据库用于处理所有日期到字符串和字符串到日期的隐式转换的格式模型,并且这些客户端应用程序也会更改日期的格式。

小提琴


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接