ORA-01839:日期对指定的月份无效

时间:2018-01-02 07:53:15

标签: sql oracle

以下查询返回

select to_char( trunc(sysdate) - numtoyminterval(level - 1, 'month'), 'mon-yy') as month from dual connect by level <= 12

根据今天的日期(即2月1日至18日),过去12个月。

enter image description here

假设今天的日期是29-DEC-17,它会给出oracle sql错误: ORA-01839:日期对指定的月份无效 (因为在减去结果中会有一个日期&#39; 29-FEB-17&#39; 这是不可能的)。因此,在特定日期,此错误会弹出。您如何建议克服这个问题?

2 个答案:

答案 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;没有固定的持续时间。