`
oboaix
  • 浏览: 269612 次
社区版块
存档分类
最新评论

获取指定日期间隔简易一例

 
阅读更多

   今日(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日

 

 

 健壮性效果不知道到底如何,还要进一步测试。

 

  

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics