我在Oracle数据库10g上有这个查询:
SELECT (CURRENT_DATE - INTERVAL '1' YEAR) FROM DUAL;
Run Code Online (Sandbox Code Playgroud)
它运行正常,但今天我收到此错误:
ORA-01839: date not valid for month specified
01839. 00000 - "date not valid for month specified"
*Cause:
*Action:
Run Code Online (Sandbox Code Playgroud)
我知道如何避免这样的错误,但我的问题是为什么抛出它?
这是预期的行为; 请参阅文档的datetime/interval算术部分中的第六个项目符号.
当间隔计算返回datetime值时,结果必须是实际的datetime值,否则数据库将返回错误.例如,接下来的两个语句返回错误:
Run Code Online (Sandbox Code Playgroud)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;第一个失败是因为在31个月中添加一个月将导致9月31日,这不是有效日期.第二个失败是因为将一年添加到仅每四年存在的日期是无效的.但是,下一个声明会成功,因为在2月29日的日期中添加四年是有效的:
Run Code Online (Sandbox Code Playgroud)SELECT TO_DATE('29-FEB-2004', 'DD-MON-YYYY') + TO_YMINTERVAL('4-0') FROM DUAL; TO_DATE(' --------- 29-FEB-08
您可以使用add_months具有相反行为的行为 - 有时也会造成混淆.您需要确定哪种方式最适合您.
| 归档时间: |
|
| 查看次数: |
2265 次 |
| 最近记录: |