为什么我不能使用sql将此日期输入表中?

时间:2016-02-02 09:15:35

标签: sql oracle

员工表的结构:

 Name          Null?    Type
 ------------- -------- ------------
 EMPLOYEE_ID   NOT NULL NUMBER(38)
 FIRST_NAME             VARCHAR2(50)
 LAST_NAME              VARCHAR2(50)
 EMAIL                  VARCHAR2(50)
 DEPT_ID                NUMBER(38)
 SALARY                 NUMBER(38)
 COMMISION_PCT          FLOAT(126)
 HIREDATE               DATE

INSERT声明:

insert into employees_table
values (05,'Sophie','Kuchinskey','sophiekuchinskey@yahoo.com',105,5000000,60,'20-sept-1994');

第1行的错误: ORA-01841 :(完整)年份必须介于-4713和+9999之间,而不是0

2 个答案:

答案 0 :(得分:4)

当使用TO_DATE的值作为格式掩码将Oracle插入DATE列时,Oracle会对非日期文字执行隐式NLS_DATE_FORMAT。如果非日期文字与此格式匹配,那么它将起作用(如果它没有,那么它会赢得) - 但是,如果NLS_DATE_FORMAT被更改,那么它将立即中断(任何调试是一件非常痛苦的事情,因为正在运行的代码不会发生,但没有人会更改代码。

您可以通过查询找到当前的NLS_DATE_FORMAT

SELECT VALUE
FROM   NLS_SESSION_PARAMETERS
WHERE  PARAMETER = 'NLS_DATE_FORMAT';

最好使用正确的格式掩码明确使用TO_DATE或使用ANSI日期文字(即DATE '2014-12-01')。

insert into employees_table
values(
  05,
  'Sophie',
  'Kuchinskey',
  'sophiekuchinskey@yahoo.com',
  105,
  5000000,
  60,
  TO_DATE( '20-sep-1994', 'DD-Mon-YYYY' )
);

或者,使用与语言环境/语言无关的ANSI格式:

insert into employees_table
values(
  05,
  'Sophie',
  'Kuchinskey',
  'sophiekuchinskey@yahoo.com',
  105,
  5000000,
  60,
  DATE '1994-09-20'
);

答案 1 :(得分:0)

请将日期转换为正确的日期格式

insert into employees_table values(05,'Sophie','Kuchinskey','sophiekuchinskey@yahoo.com',105,5000000,60,to_date('20-sep-1994','dd-Mon-YYYY'));

你也不能把月份作为9月。应该是sep。