Oracle自定义函数--增加月份

浏览: 2766

场景

获取输入时间的下N(N>=0)个月的日期。

场景一:输入6月30,则返回7月30,由于Oracle默认的add_months函数获取的是7月31(因为输入的6月30是6月最后一天,Oracle默认获取7月最后一天)

场景二:输入1月31,则返回2月28(如果有29号则返回29)

代码剖析

输入参数

  1. 要计算的日期
  2. 增加的年份
  3. 增加的月份

返回

      日期

逻辑

使用interval函数实现场景一,但是当出现场景二时(下个月没有31号时),此函数会报ora-01839(指定月份的日期无效);

当输入参数出现负数月份时,此函数会报ora-01867(间隔无效)

当interval函数出现异常,则使用add_months实现场景二。

create or replace function add_month(iv_date    in date,
year_nums in number default 0,
month_nums in number default 0)
return date is
Result date;
num varchar2(10);
month_error EXCEPTION;
PRAGMA EXCEPTION_INIT(month_error, -1839); --ora-01839
interval_error exception;
PRAGMA EXCEPTION_INIT(interval_error, -1867); --ora-01867
begin
num := to_char(year_nums) || '-' || to_char(month_nums);
Result := iv_date + TO_YMINTERVAL(num);
return(Result);
exception
when month_error then
result := add_months(iv_date, year_nums * 12 + month_nums);
return(Result);
when interval_error then
result := add_months(iv_date, year_nums * 12 + month_nums);
return(Result);
end add_month;

无法适用场景

由于to_yminterval函数无法使用负数

interval -1 month是可以使用负数的,但是写入函数里会报错,所以不适用向前取日期。

如果输入负数月份,则会使用add_months函数

比如输入6月30,本应返回5月30,却返回5月31,如有建议,欢迎留言。

推荐 0
本文由 老头子 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册