如何在oracle10g数据库中插入当前系统日期和时间

时间:2013-11-15 07:35:24

标签: oracle10g

我创建了一个具有列date_time类型(varchar2(40))的表,但是当我尝试插入当前系统日期和时间时,它会产生错误(值太多)。请告诉我insert语句有什么问题。

create table HR (type varchar2 (20), raised_by number (6), complaint varchar2 (500), date_time varchar2(40))


insert into HR values ('request',6785,'good morning',sysdate,'YYYY/MM/DD:HH:MI:SSAM')

3 个答案:

答案 0 :(得分:3)

错误的直接原因是您有太多的值,如消息所示;也就是说,values子句中的元素多于列。最好明确列出列名以避免将来出现问题和混淆,所以你真的这样做:

insert into HR (type, raised_by, complaint, date_time)
values ('request',6785,'good morning',sysdate,'YYYY/MM/DD:HH:MI:SSAM')

... sp你有四列,但有五个值。您试图将当前日期/时间作为字符串插入,因此您需要使用to_char() function

insert into HR (type, raised_by, complaint, date_time)
values ('request',6785,'good morning',
  to_char(sysdate,'YYYY/MM/DD:HH:MI:SSAM'))

但将日期(或任何其他结构化数据,如数字)存储为字符串是不好的做法。正如documentation notes

  

Oracle数据库操纵的每个值都有一个数据类型。数据   值的类型将固定的属性集与值相关联。   这些属性使Oracle处理一种数据类型的值   不同于另一个的价值观。例如,您可以添加值   NUMBER数据类型,但不是RAW数据类型的值。

如果使用字符串,则可以输入无效值。如果使用正确的DATE数据类型,则不会意外地将无效或混淆的值放入.Oracle也将能够优化使用该列,将能够安全有效地比较值。虽然您使用的格式比某些格式更好,但使用字符串比较仍然无法轻松比较两个值以查看哪个更早,因此您无法通过date_time列正确排序。

假设您插入了两行,其值为2013/11/15:09:00:00AM2013/11/15:08:00:00PM - 这是更早的?您需要查看AM / PM标记以实现第一个标记更早;使用字符串比较,您会错误,因为8将在9之前排序。使用HH24代替HHAM可以避免这种情况,但效率仍然低于真实日期。

如果您需要存储带有时间组件的日期,可以使用DATE data type,其精度低至秒;或者如果您还需要小数秒,则可以使用TIMESTAMP。然后你的表和插入将是:

create table HR (type varchar2 (20), raised_by number (6),
  complaint varchar2 (500), date_time date);

insert into HR (type, raised_by, complaint, date_time)
values ('request',6785,'good morning',sysdate);

您仍然可以使用所需格式的值作为查询的一部分进行显示:

select type, raised_by, complaint,
  to_char(date_time, 'YYYY/MM/DD:HH:MI:SSAM') as date_time
from HR
order by date_time;

TYPE                  RAISED_BY COMPLAINT            DATE_TIME           
-------------------- ---------- -------------------- ---------------------
request                    6785 good morning         2013/11/15:08:44:35AM 

仅将日期视为字符串以供显示。

答案 1 :(得分:0)

您可以使用 TO_DATE() TO_TIMESTAMP To_char()功能,

插入HR值('request',6785,'早上好',TO_DATE(sysdate,'yyyy / mm / dd hh24:mi:ss'))

插入HR值('request',6785,'早上好',TO_TIMESTAMP(systimestamp,'yyyy / mm / dd hh24:mi:ss'))

sysdate - 它会给出日期和时间。

systimestamp - 它将以毫秒为单位给出日期时间。

To_date() - 用于将字符串转换为日期。 To_char() - 用于将日期转换为字符串。

可能在这里你必须使用To_char(),因为你的表定义的date_time列的varchar类型。

答案 2 :(得分:-1)

TIMESTAMP使用date_time数据类型。插入时使用当前时间戳。

create table HR (type varchar2(20), raised_by number(6), complaint varchar2(500), date_time timestamp);


insert into HR values ('request',6785,'good morning', systimestamp);

对于其他选项:http://psoug.org/reference/timestamp.html