6

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

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

我得到它的错误

ORA-01839: date not valid for month specified

如何使用间隔关键字与任何日期兼容?或者,如果有人有更好的方法来解决这个问题,我会全神贯注。

谢谢你。

4

2 回答 2

12

尝试

select add_months(sysdate,-1) from dual
于 2009-12-31T13:27:49.707 回答
2

作为迂腐...

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

TRUNC(SYSDATE,'MM')

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

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

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

于 2010-01-01T00:41:06.823 回答