Oracle DB Ora-01839:日期对于指定的月份无效。29-02-2016闰年

Oracle DB Ora-01839:日期对于指定的月份无效。29-02-2016闰年,oracle,oracle12c,leap-year,Oracle,Oracle12c,Leap Year,我们都知道今天是一个特别的日子。2016年2月29日是闰年 我们从Oracle数据库中的某些表收到一条错误消息。错误为:Oracle ORA-01839:日期对于指定的月份无效 例如,一个简单的选择错误发生的位置:select*fromtable where table_date>sysdate-0.1 对于其他表,此选择没有问题,只是对于某些表 有没有办法解决这个问题?因为我们今天不能使用很多桌子 经过深入研究,我们正在使用Oracle 12c,这很清楚为什么我们的一些选择在今天不起作用。该错

我们都知道今天是一个特别的日子。2016年2月29日是闰年

我们从Oracle数据库中的某些表收到一条错误消息。错误为:
Oracle ORA-01839:日期对于指定的月份无效

例如,一个简单的选择错误发生的位置:
select*fromtable where table_date>sysdate-0.1

对于其他表,此选择没有问题,只是对于某些表

有没有办法解决这个问题?因为我们今天不能使用很多桌子


经过深入研究,我们正在使用Oracle 12c,这很清楚为什么我们的一些选择在今天不起作用。该错误是由关键字
interval
及其已知问题引起的。(或者,这是第205页底部/第206页顶部所说的工作方式)

以下是来自以下网站的qoute:

问题

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
回答

间隔就是这样工作的。闰年是最短的 问题将1个月添加到3月31日会导致相同的错误。如果你 要确保结果为有效日期,请使用 加上个月。(没有用于添加年份的单独功能;使用 添加_MONTH(SYSDATE,12*n)以获取n年后的日期。)


在我们的案例中发生的原因:

在我们的例子中,出于安全原因,我们对一些表使用了虚拟专用数据库。在那里,我们在大多数选择中应用了
interval
关键字

该怎么办:

改用
添加月份

select add_months(to_date('2012-feb-29','yyyy-mon-dd'), 12) as dt from dual;

table\u date
的数据类型是什么?@WernfriedDomscheit其a
date
是否从中选择table\u date…
也会出现该错误-可能是另一列隐式转换失败?它是一个表还是一个视图(计算某些东西);或者它有一个虚拟列?获取错误的会话中的NLS_DATE_格式是什么?你在一个特定的客户机上看到了这一点吗?你能用SQL*Plus重现吗?好吧,你浪费了我主要用来解释间隔处理的答案,但很高兴你发现了它*8-)是的。请注意,夏令时的行为也不同。比较
TIMESTAMP'2015-10-25 01:30:00 Europe/Berlin'+INTERVAL'1'MONTH
ADD_MONTH(TIMESTAMP'2015-10-25 01:30:00 Europe/Berlin',1)
我们错误地得到了与以下类似的代码(这导致了今天的Oracle异常,因为ODP.NET将INTERVAL与
DbFunctions.AddYears一起使用):
DataSet.Where(e=>e.Date>=DbFunctions.AddYears(DateTime.Now,-1))
感谢您的支持。如果您不支持跨越月份边界和闰年,我想知道支持日期+间隔还有什么意义。。。