我创建了一个具有列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')
答案 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:00AM
和2013/11/15:08:00:00PM
- 这是更早的?您需要查看AM / PM标记以实现第一个标记更早;使用字符串比较,您会错误,因为8
将在9
之前排序。使用HH24
代替HH
和AM
可以避免这种情况,但效率仍然低于真实日期。
如果您需要存储带有时间组件的日期,可以使用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);