oracle中的add\u month问题,我需要生成帐单周期

u3r8eeie  于 2021-07-29  发布在  Java
关注(0)|答案(3)|浏览(283)

我有一个要求生成到帐单周期日期,例如
如果我的输入是3月27日,那么我的下一个周期从4月27日开始。
如果输入是1月10日,那么下一个周期应该从2月10日开始。
我使用的是oracle add\u month(i/p date,1)。这增加了一个新的月份,给我相同的日期为下个月,工作罚款为上述日期。
但有一种情况是,我的输入日期是2018年2月28日,如果我从dual中选择了add\u months(日期“2018-02-28”,1),那么输出日期是2018年3月31日。
我预计结果应该是3月28日。这件案子有什么可行的解决办法。

ljsrvy3e

ljsrvy3e1#

稍微计算一下可能会有所帮助。

SQL> with test (col) as
  2    (select date '2020-03-27' from dual union all
  3     select date '2020-01-10' from dual union all
  4     select date '2018-02-27' from dual union all
  5     select date '2018-02-28' from dual
  6    )
  7  select col,
  8    least(add_months(col, 1),
  9          add_months(trunc(col, 'mm'), 1) + (col - trunc(col, 'mm'))
 10         ) result
 11  from test
 12  order by col;

COL        RESULT
---------- ----------
27.02.2018 27.03.2018
28.02.2018 28.03.2018
10.01.2020 10.02.2020
27.03.2020 27.04.2020

SQL>
3gtaxfhh

3gtaxfhh2#

select to_date('28-FEB-2020', 'DD-MON-YYYY'), 
ADD_MONTHS( to_date('28-FEB-2020', 'DD-MON-YYYY'), 1) from dual;

select to_date('28-FEB-2018', 'DD-MON-YYYY'), 
ADD_MONTHS( to_date('28-FEB-2018', 'DD-MON-YYYY'), 1) from dual;

上面的查询将显示3月31日,因为2月28日是2018年的最后一天,并且由于您使用的是add\u months功能,所以它将考虑每个月的最后一天。执行下面的查询,你会很容易理解,

select to_date('28-FEB-2018', 'DD-MON-YYYY'), 
ADD_MONTHS( to_date('28-FEB-2018', 'DD-MON-YYYY'), 1) from dual;
33qvvth1

33qvvth13#

您可以使用下面的代码,并相应地添加2月29日的条件,以及如果你想。

select 
case when extract( day from last_day(to_date('28-FEB-2020', 'DD-MON-YYYY'))) =  extract( day from to_date('28-FEB-2020', 'DD-MON-YYYY')) 
        then decode(extract( day from last_day(to_date('28-FEB-2020', 'DD-MON-YYYY'))), 28, to_date('28-FEB-2020', 'DD-MON-YYYY') + 28,ADD_MONTHS( to_date('28-FEB-2020', 'DD-MON-YYYY'), 1) ) 
        else ADD_MONTHS( to_date('28-FEB-2020', 'DD-MON-YYYY'), 1) end as result
from dual;

相关问题