【问题标题】:Oracle: year must be between -4713 and +9999, and not be 0Oracle:年份必须介于 -4713 和 +9999 之间,不能为 0
【发布时间】:2015-02-20 06:18:47
【问题描述】:

我有一个这样的 Oracle 表

|---------------------------------|
|EMPNO |    HIREDATE  | INDEX_NUM |  
|---------------------------------|  
|1     |   2012-11-13 | 1         |
|2     |   2          | 1         |
|3     |   2012-11-17 | 1         |
|4     |   2012-11-21 | 1         |
|5     |   2012-11-24 | 1         |
|6     |   2013-11-27 | 1         |
|7     |   2          | 2         |
|---------------------------------|

我正在尝试针对此表执行此query

SELECT hiredate
  FROM admin_emp
  WHERE TO_DATE('hiredate','yyyy-mm-dd') >= TO_DATE('2012-05-12','yyyy-mm-dd');

但得到错误

ORA-01841: (full) year must be between -4713 and +9999, and not be 0

任何想法..?这里有什么问题?

查询库:

CREATE TABLE admin_emp (
         empno      NUMBER(5) PRIMARY KEY,
         hiredate   VARCHAR(255),
         index_num NUMBER(5));


insert into admin_emp(empno,hiredate,index_num) values
(1,'2012-11-13',1);
insert into admin_emp(empno,hiredate,index_num) values
(2,'2',1);
insert into admin_emp(empno,hiredate,index_num) values
(3,'2012-11-17',1);
insert into admin_emp(empno,hiredate,index_num) values
(4,'2012-11-21',1);
insert into admin_emp(empno,hiredate,index_num) values
(5,'2012-11-24',1);
insert into admin_emp(empno,hiredate,index_num) values
(6,'2013-11-27',1);
insert into admin_emp(empno,hiredate,index_num) values
(7,'2',2);

【问题讨论】:

    标签: sql oracle date select


    【解决方案1】:

    年份使用 'rrrr' 格式:

    SELECT hiredate
    FROM admin_emp
    WHERE TO_DATE(hiredate,'rrrr-mm-dd') >= TO_DATE('2012-05-12','rrrr-mm-dd');
    

    【讨论】:

      【解决方案2】:

      SQL 中的单引号 (') 表示字符串文字。所以'hiredate' 不是hiredate 列,它只是一个varchar,当然,它不符合您指定的日期格式。只需去掉引号就可以了:

      SELECT hiredate
      FROM   admin_emp
      WHERE  TO_DATE(hiredate,'yyyy-mm-dd') >= -- No quotes 
             TO_DATE('2012-05-12','yyyy-mm-dd');
      

      【讨论】:

      • 对不起...另一个错误..ORA-01840: input value not long enough for date format ,让我试试
      • 有些行只有2 对应hiredate。它应该如何解释?强烈建议您重新设计您的表格,并使用DATE 作为hiredate 的类型。将为您省去很多麻烦
      • 您最后的insert 语句insert into admin_emp(empno,hiredate,index_num) values (7,'2',2);hiredate 中有非法值 - 您应该删除它。顺便说一句,将此列定义为 date 可能是一个更好的主意,并且省去了所有这些麻烦。
      • 我同意这样的建议,即如果您尝试存储日期,您应该出于这个原因将该列设为 DATE 数据类型(强制执行正确的数据输入)。
      • @Suganthan 数据量实际上不是问题。只需添加一个新列,进行一次更新,然后删除现有列(并可能将新列重命名为旧名称)。无论是数百万行还是只有数百行,都没有太大区别。即使使用基于函数的索引,你也会遇到很多麻烦,因为你的插入数据可能是不合理的
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多