获取指定日期间隔简易一例
?? 今日(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 varchar2isyear_ number;month_ number;day_ number;temp_date date;date2 date:=d2;date1 date:=d1;beginif 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日
?
?
?健壮性效果不知道到底如何,还要进一步测试。
?
??