Oracle DB Ora-01839:日期对于指定的月份无效。29-02-2016闰年
我们都知道今天是一个特别的日子。2016年2月29日是闰年 我们从Oracle数据库中的某些表收到一条错误消息。错误为: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,这很清楚为什么我们的一些选择在今天不起作用。该错
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其adate
是否从中选择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))
感谢您的支持。如果您不支持跨越月份边界和闰年,我想知道支持日期+间隔还有什么意义。。。