以下查询返回
select to_char( trunc(sysdate) - numtoyminterval(level - 1, 'month'), 'mon-yy') as month from dual connect by level <= 12
根据今天的日期(即2月1日至18日),过去12个月。
假设今天的日期是29-DEC-17,它会给出oracle sql错误: ORA-01839:日期对指定的月份无效 (因为在减去结果中会有一个日期&#39; 29-FEB-17&#39; 这是不可能的)。因此,在特定日期,此错误会弹出。您如何建议克服这个问题?
答案 0 :(得分:1)
我更喜欢ADD_MONTHS(日期文字的TRUNC是愚蠢的,但我离开了,因为你还有SYSDATE,不是吗?):
SQL> select to_char(add_months(trunc(date '2017-12-29'), -level), 'dd-mon-yy',
2 'nls_Date_language = english') as month
3 from dual
4 connect by level <= 12;
MONTH
------------------
29-nov-17
29-oct-17
29-sep-17
29-aug-17
29-jul-17
29-jun-17
29-may-17
29-apr-17
29-mar-17
28-feb-17
29-jan-17
29-dec-16
12 rows selected.
SQL>
答案 1 :(得分:1)
INTERVAL YEAR TO MONTH
的此行为已记录在案,请参阅Datetime/Interval Arithmetic
您应该考虑功能ADD_MONTHS:
如果日期是该月的最后一天,或者是由此产生的月份 比日期的日期组件少的天数,则结果是最后一天 由此产生的一天。否则,结果在同一天 组件作为日期。
这取决于您的要求,您认为&#34;对&#34;。实际上&#34;一个月&#34;没有固定的持续时间。