我们都知道今天是一个特别的日子。它是29th of February 2016
of a闰年。
我们从Oracle DB中的某些表中收到一条错误消息。错误是:Oracle ORA-01839: date not valid for month specified
。
例如,一个简单的选择错误发生的地方:select * from table where table_date > sysdate -0.1;
对于其他表,这个选择没有问题,只对一些表。
有办法解决这个问题吗?因为我们今天不能使用很多表格。
我们正在使用Oracle 12c
。
发布于 2016-02-29 10:14:51
经过深入研究,很清楚为什么我们的一些选择在今天不起作用。此错误是由关键字interval
及其已知问题引起的。(或者这就是ANSI/ISO规范说它应该工作的方式,第205页底部/第206页顶部)
这是oracle社区博客的一首歌
问题:
select to_date('2012-feb-29','yyyy-mon-dd') + interval '1' year as dt from dual;
ORA-01839: date not valid for month specified
01839. 00000 - "date not valid for month specified"
*Cause:
*Action:
select to_date('2012-feb-29','yyyy-mon-dd') + interval '2' year as dt from dual;
ORA-01839: date not valid for month specified
01839. 00000 - "date not valid for month specified"
*Cause:
*Action:
select to_date('2012-feb-29','yyyy-mon-dd') + interval '3' year as dt from dual;
ORA-01839: date not valid for month specified
01839. 00000 - "date not valid for month specified"
*Cause:
*Action:
select to_date('2012-feb-29','yyyy-mon-dd') + interval '4' year as dt from dual;
29-FEB-16 00:00:00
select to_date('2012-feb-29','yyyy-mon-dd') + interval '1' day as dt from dual;
01-MAR-12 00:00:00
select to_date('2012-feb-29','yyyy-mon-dd') + interval '1' month as dt from dual;
29-MAR-12 00:00:00
答案
这就是间隔的工作方式。闰年是问题中最小的一个月,到3月31日再加一个月,就会产生同样的错误。如果要确保结果是有效日期,请使用ADD_MONTHS。(添加年份没有单独的函数;使用ADD_MONTH (SYSDATE,12*n)获得n年后的日期。)
为什么会在我们的案例中发生:
在我们的例子中,出于安全考虑,我们对一些表使用虚拟私有数据库。在这里,我们在大多数选择中使用了interval
关键字。
应该做什么:
使用ADD_MONTHS
代替。
select add_months(to_date('2012-feb-29','yyyy-mon-dd'), 12) as dt from dual;
https://stackoverflow.com/questions/35695175
复制相似问题