基本上,我有一个查询负责在上个月内获取所有记录(使用特定过滤器)。我使用的是Oracle的interval关键字,直到今天(2009年12月31日)都运行良好。我正在使用的代码是
select (sysdate - interval '1' month) from dual
和我得到的错误
ORA-01839: date not valid for month specified
如何使用interval关键字与任何日期兼容?或者,如果有人有更好的方法来处理这个问题,我会全力以赴。
谢谢。
答案 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天。