问题描述
我的问题是关于ADD_MONTHS函数。测试用例的实时sql链接如下:-
https://livesql.oracle.com/apex/livesql/s/JT1FDGOHXMRWN3LG94GEYLMPJ
如果我们看一下此链接,它有3个组件:-
1.采用旧日期并添加一个月直到日期大于sysdate的函数
2.使用旧日期25/03/1999调用该函数输出返回一个日期25/04/2020,符合预期
3.然后使用旧日期28/03/1999调用该函数。输出返回31/03/2020日期。尽管输入日期不是该月的最后日期,为什么输出日期会变成该月的日期?为什么中间日期2月28日会继续规定所有下一个月的日期都应该是该月的最后日期?还是我错过了什么?
如果一个人需要日期28/04/2020而不是上面项目符号3中的31/03/2020,该怎么办?
谢谢
Arnab P
https://livesql.oracle.com/apex/livesql/s/JT1FDGOHXMRWN3LG94GEYLMPJ
如果我们看一下此链接,它有3个组件:-
1.采用旧日期并添加一个月直到日期大于sysdate的函数
2.使用旧日期25/03/1999调用该函数输出返回一个日期25/04/2020,符合预期
3.然后使用旧日期28/03/1999调用该函数。输出返回31/03/2020日期。尽管输入日期不是该月的最后日期,为什么输出日期会变成该月的日期?为什么中间日期2月28日会继续规定所有下一个月的日期都应该是该月的最后日期?还是我错过了什么?
如果一个人需要日期28/04/2020而不是上面项目符号3中的31/03/2020,该怎么办?
谢谢
Arnab P
专家解答
根据文档
“如果日期是该月的最后一天,或者如果结果月份的天数少于日期的日分量,则结果是结果月份的最后一天。否则,结果与日期具有相同的日分量。”
这意味着
与
示例
所以你可以利用months_thers.
“如果日期是该月的最后一天,或者如果结果月份的天数少于日期的日分量,则结果是结果月份的最后一天。否则,结果与日期具有相同的日分量。”
这意味着
result := ADD_MONTHS(x,2) ;
与
result := ADD_MONTH(x,1); result := ADD_MONTH(result,1)
示例
SQL> select add_months(date '2020-01-30',1) from dual; ADD_MONTH --------- 29-FEB-20 SQL> select add_months(date '2020-02-29',1) from dual; ADD_MONTH --------- 31-MAR-20 SQL> select add_months(date '2020-01-30',2) from dual; ADD_MONTH --------- 30-MAR-20
所以你可以利用months_thers.
SQL> create or replace function fn_get_next_monthly_date(i_in_date date)
2 return date
3 is
4 l_date date;
5 l_mb int;
6 begin
7 l_mb := months_between(sysdate,i_in_date);
8 l_date := add_months(i_in_date, l_mb);
9 return l_date;
10
11 end fn_get_next_monthly_date;
12 /
Function created.
SQL>
SQL> select fn_get_next_monthly_date(to_date('25/03/1999', 'dd/mm/yyyy')) from dual;
FN_GET_NE
---------
25-MAR-20
SQL> select fn_get_next_monthly_date(to_date('28/03/1999', 'dd/mm/yyyy')) from dual;
FN_GET_NE
---------
28-MAR-20
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




