一个月的间隔时间没有在31日工作?

时间:2009-12-31 13:24:39

标签: datetime oracle10g intervals

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

select (sysdate - interval '1' month) from dual

和我得到的错误

ORA-01839: date not valid for month specified

如何使用interval关键字与任何日期兼容?或者,如果有人有更好的方法来处理这个问题,我会全力以赴。

谢谢。

2 个答案:

答案 0 :(得分:10)

尝试

select add_months(sysdate,-1) from dual

答案 1 :(得分:2)

迂腐......

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

TRUNC(SYSDATE,'MM')

否则,也许他们想要在当前日期之前的1个月的任意时间段 - 但那么你如何定义它?正如您所发现的那样,INTERVAL '1' MONTH只是从日期的月份中减去一个 - 例如15-JAN-2009 - INTERVAL '1' MONTH返回1999年12月15日。对于某些日期,这会导致无效日期,因为并非所有月份都具有相同的天数。

ADD_MONTHS通过返回当月的最后一天来解决此问题,例如ADD_MONTHS(31-DEC-2009,-1)返回30-NOV-2009。

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