Datetime 间隔一个月后31日不工作?

Datetime 间隔一个月后31日不工作?,datetime,oracle10g,intervals,Datetime,Oracle10g,Intervals,本质上,我有一个查询,负责在上个月内获取所有记录(带有特定过滤器)。我正在使用Oracle的interval关键字,直到今天(2009年12月31日),一切都很顺利。我使用的代码是 select (sysdate - interval '1' month) from dual 我得到了错误 ORA-01839: date not valid for month specified 如何使用interval关键字与任何日期兼容?或者如果有人有更好的方法来解决这个问题,我洗耳恭听 谢谢。试试看

本质上,我有一个查询,负责在上个月内获取所有记录(带有特定过滤器)。我正在使用Oracle的interval关键字,直到今天(2009年12月31日),一切都很顺利。我使用的代码是

select (sysdate - interval '1' month) from dual
我得到了错误

ORA-01839: date not valid for month specified
如何使用interval关键字与任何日期兼容?或者如果有人有更好的方法来解决这个问题,我洗耳恭听

谢谢。

试试看

select add_months(sysdate,-1) from dual
学究气

这些要求并没有完全明确地规定出来。“上个月内”是什么意思?大多数人会认为这意味着“在当前日历月内”,在这种情况下,我会使用:

TRUNC(SYSDATE,'MM')
否则,他们可能希望在当前日期之前有一个任意的1个月的时间段,但是你怎么定义呢?正如您所发现的,
INTERVAL'1'MONTH
只需从日期的月份部分减去一即可-例如
2009年1月15日-INTERVAL'1'MONTH
返回1999年12月15日。对于某些日期,这会导致无效日期,因为并非所有月份的天数都相同

ADD_MONTHS
通过返回该月的最后一天来解决此问题,例如
ADD_MONTHS(2009年12月31日,-1)
返回2009年11月30日


另一种可能性是,企业实际上希望使用平均月周期,例如365/12,约为30.4。他们可能希望您使用
SYSDATE-30
,当然12次迭代只能覆盖一年中的360天。

谢谢。)你知道为什么add_months()有效,但不是interval吗?这是因为12月有31天,11月只有30天吗?不完全确定,但INTERVAL是另一种数据类型(类似于日期和时间戳),Steve Feuerstein的PL/SQL书中关于它的所有内容看起来相当复杂。我通常选择最简单有效的东西!自Oracle7以来,ADD_月份一直存在,并且适用于日期类型(即SYSDATE)。如果您想从午夜开始,您可能需要使用ADD_MONTHS(trunc(sysdate),-1)。太好了!感谢您的澄清和代码修改。:)有很多有用的内置函数,比如ADD_MONTHS,对于您正在做的事情可能很有用。例如,从dual中选择last_day(add_months(trunc(sysdate),-1))+1将为您提供当月的第一天(通过转到上个月的最后一天并添加1),如果您只想获取当月的记录,这可能更有用。