场景
获取输入时间的下N(N>=0)个月的日期。
场景一:输入6月30,则返回7月30,由于Oracle默认的add_months函数获取的是7月31(因为输入的6月30是6月最后一天,Oracle默认获取7月最后一天)
场景二:输入1月31,则返回2月28(如果有29号则返回29)
代码剖析
输入参数
- 要计算的日期
- 增加的年份
- 增加的月份
返回
日期
逻辑
使用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,如有建议,欢迎留言。