oracle - 为什么当我从当前日期减去一年时出现 Oracle 错误?

标签 oracle oracle10g

我在 Oracle 数据库 10g 上有以下查询:

SELECT (CURRENT_DATE - INTERVAL '1' YEAR) FROM DUAL;

它运行正常,但今天我收到此错误:

ORA-01839: date not valid for month specified
01839. 00000 -  "date not valid for month specified"
*Cause:    
*Action:

我知道如何避免此类错误,但我的问题是为什么会抛出该错误?

最佳答案

这是预期的行为;请参阅第六个项目符号 in the datetime/interval arithmetic section文档。

When interval calculations return a datetime value, the result must be an actual datetime value or the database returns an error. For example, the next two statements return errors:

SELECT TO_DATE('31-AUG-2004','DD-MON-YYYY') + TO_YMINTERVAL('0-1')
FROM DUAL;

SELECT TO_DATE('29-FEB-2004','DD-MON-YYYY') + TO_YMINTERVAL('1-0')
FROM DUAL;

The first fails because adding one month to a 31-day month would result in September 31, which is not a valid date. The second fails because adding one year to a date that exists only every four years is not valid. However, the next statement succeeds, because adding four years to a February 29 date is valid:

SELECT TO_DATE('29-FEB-2004', 'DD-MON-YYYY') + TO_YMINTERVAL('4-0')
FROM DUAL;

TO_DATE('
---------
29-FEB-08

您可以使用add_months ,它具有相反的行为 - 有时也会引起困惑。您需要决定哪一个最适合您。

关于oracle - 为什么当我从当前日期减去一年时出现 Oracle 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9495905/

相关文章:

sql - 从不同的模式调用包内的 Oracle 过程?

oracle - 为什么我得到PLS-00302:组件存在时必须声明?

sql - 如何计算 Oracle varchar 值中某个字符的出现次数?

database - 如何使用 oracle-10g 在层次结构查询中获取根祖先?

sql - oracle 数据库中 update-set-clause 中表达式的求值顺序

oracle - 是否可以在包/过程之外创建Oracle关联数组类型?

c++ - Qt PL/SQL-赋值运算符-字符串缓冲区太小

java - 为什么在Java中查询一个日期BC改成AD?

sql - Oracle 的解释计划有多准确?

stored-procedures - 通过调度程序作业将参数传递给oracle存储过程