【问题标题】:Why can't I enter this date into a table using sql?为什么我不能使用 sql 将此日期输入到表中?
【发布时间】:2016-02-02 09:15:34
【问题描述】:

员工表的结构:

 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

【问题讨论】:

  • 展示employees_table的结构会有所帮助
  • to_char('20-SEP-1994', 'dd-Mon-yyyy')
  • 无法识别/支持您尝试使用的日期格式。它可能将它们解析为y-m-d,将20 视为无效年份。
  • @Rahul Tripathi:不是to_char,而是to_date,因为你想要约会。日期文字是另一种方法。查看 MT0 的答案。

标签: sql oracle


【解决方案1】:

当使用NLS_DATE_FORMAT 的值作为格式掩码将非日期文字插入DATE 列时,Oracle 将对非日期文字执行隐式TO_DATE。如果非日期文字与此格式匹配,则它将起作用(如果不匹配,则不会)-但是,如果 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'
);

【讨论】:

    【解决方案2】:

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

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

    您也不能将月份指定为 sept 。应该是九月。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-10
      • 2015-09-27
      • 1970-01-01
      • 2019-04-24
      • 2021-12-16
      相关资源
      最近更新 更多