oracle table 中的年份值

year value in table in oracle

我在 oracle 中有这个查询:

 DELETE FROM my_table
 WHERE to_date(last_update, 'DD/MM/YYYY') < to_date('01/01/2000', 'DD/MM/YYYY');

当我 运行 这个时,我得到这个错误: ORA-01841: (完整) 年份必须在 -4713 和 +9999 之间并且不能是 0

table 中没有任何 0 值。

谁知道是什么问题?

我假设您已将日期存储为 DD/MM/YYYY 格式的字符串;如果您将它们全部存储为 DATE 数据类型会更好,这样您就不必进行此转换(并且您将为数据使用最合适的数据类型)。

从 Oracle 12 开始,您可以使用:

SELECT *
FROM   my_table
WHERE  TO_DATE( last_update, 'DD/MM/YYYY' DEFAULT NULL ON CONVERSION ERROR ) IS NULL;

确定引发该异常的行。


如果您已经将它们存储为 DATE 数据类型,那么不要在已经是 DATE 的值上使用 TO_DATE,因为 TO_DATE 期望string 因此 Oracle 会将您的 DATE 隐式转换为字符串,然后尝试将其转换回来,您的查询有效:

DELETE FROM my_table
WHERE  TO_DATE(
         TO_CHAR(
           last_update,
           ( SELECT value FROM NLS_SESSION_SETTINGS WHERE PARAMETER = 'NLS_DATE_FORMAT' )
         ),
         'DD/MM/YYYY'
       ) < to_date('01/01/2000', 'DD/MM/YYYY');

如果 NLS_DATE_FORMAT 和你的格式模型不匹配,那么你会得到错误(或者,更糟的是,查询会成功并且你的数据会不一致,因为它可能已经交换了几天和几个月或几个月和年)。

相反,只需使用:

DELETE FROM my_table
WHERE last_update < DATE '2000-01-01';

如果last_update的数据类型是日期,不要使用to_date函数:

DELETE FROM my_table
 WHERE last_update < to_date('01/01/2000', 'DD/MM/YYYY');