今日(2011-12-27)一哥们(Oracle 10.2.0)碰到一Oracle间隔日期计算问题,原意是给出两个日期,获取两个日期之间的间隔数值,返回形如格式:x年x月x日,类似倒计时工具计时器。这里权当作个记录,当时使用到了Oracle 数据类型interval来做处理,因为参数传递的问题,没有奏效,最后使用内置函数解决,这里仅此作个记录,下次留用。主要是要考虑到闰年、闰月、每个月的不同天数问题。,贴出函数脚本
create or replace function fn_interval_ymd(d2 date,d1 date) return varchar2 is year_ number; month_ number; day_ number; temp_date date; date2 date:=d2; date1 date:=d1; begin if date1-date2>0 then temp_date:=date2; date2:=date1; date1:=temp_date; end if; year_ :=floor(months_between(date2,date1)/12); month_:=floor(months_between(date2,(date1+NUMTOYMINTERVAL(year_, 'year')))); day_ :=date2-((date1+NUMTOYMINTERVAL(year_, 'year'))+NUMTOYMINTERVAL(month_, 'month')); return lpad(year_,4,'0')||'年'||lpad(month_,2,'0')||'月'||lpad(day_,2,'0')||'日'; exception when others then dbms_output.put_line('Input date format exception!'); return ''; end;
测试效果:
select fn_interval_ymd(sysdate,sysdate-1000) from dual;
----------
0002年08月26日
----------
select fn_interval_ymd(to_date('2008-05-01','yyyy-mm-dd'),
to_date('2006-04-21','yyyy-mm-dd')) from dual;
0002年00月10日
----------
select fn_interval_ymd(to_date('2008-02-11','yyyy-mm-dd'),
to_date('2008-03-05','yyyy-mm-dd')) from dual;
----------
0000年00月23日
健壮性效果不知道到底如何,还要进一步测试。