0

我已经创建了一个包含 date_time 类型 (varchar2 (40) ) 列的表,但是当我尝试插入当前系统日期和时间时,它不起作用它会给出错误(值太多)。请告诉我插入语句有什么问题。

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

3 回答 3

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()函数

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

但是将日期(或任何其他结构化数据,例如数字)存储为字符串是一种不好的做法。如文档所述:

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数据类型,它的精度可以精确到秒;或者如果您也需要小数秒,那么您可以使用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 

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

于 2013-11-15T08:46:36.400 回答
0

You can use TO_DATE() or TO_TIMESTAMP or To_char() function,

insert into HR values ('request',6785,'good morning',TO_DATE(sysdate, 'yyyy/mm/dd hh24:mi:ss'))

insert into HR values ('request',6785,'good morning',TO_TIMESTAMP(systimestamp, 'yyyy/mm/dd hh24:mi:ss'))

sysdate - It will give date with time.

systimestamp - It will give datetime with milliseconds.

To_date() - Used to convert string to date. To_char() - Used to convert date to string.

Probably here you have to use To_char() because your table definition have varchar type for date_time column.

于 2013-11-15T07:42:04.573 回答
-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

于 2013-11-15T07:44:27.687 回答