oracle计算一个日期加上指定工作日(排除周六周日和一系列节假日)时间

来源:互联网 发布:传世1.0源码 编辑:程序博客网 时间:2024/04/29 23:30
第一步:
创建一个表格holiday用于灵活存放节假日日期(周末除外),如果和周末日期重复,则无需添加到该表格中:
Sql代码  
create table HOLIDAY  (  
   ID                   VARCHAR2(45)                    not null,  
   HL_DATE              DATE,  
   HL_DESC              VARCHAR2(500),  
   REMARK               VARCHAR2(500),  
   constraint PK_HOLIDAY primary key (ID)  
);    www.2cto.com  
comment on table HOLIDAY is  
'节假日日期表(不含周末)';  
  
comment on column HOLIDAY.ID is  
'节假日编号';  
  
comment on column HOLIDAY.HL_DATE is  
'节假日期';  
  
comment on column HOLIDAY.HL_DESC is  
'假日说明';  
  
comment on column HOLIDAY.REMARK is  

'备注';  

第二步:写个函数用以获取两个日期之间的周末天数,如下:
Sql代码  
create or replace function weekend_count(startdate date,enddate date)  
 return number  
 /**返回两个时间段内的周末天数,开始日期不计算在内*/  
is   
weekend_num number:=0;  
tempdate date;  
begin  
 tempdate:=startdate+1;  
 while tempdate<=enddate loop  
 weekend_num:=weekend_num+(case when to_char(tempdate,'day') in('星期六','星期日') then 1 else 0 end);   
 tempdate:=tempdate+1;  
 end loop;  
 return weekend_num;  
end;  
第三步:编写函数用以获取指定日期延迟特定工作日以后的具体日期,如下:
 
Sql代码  
create or replace function getDeferDate(startdate date,deferDay number)  
 return date  
 /**返回延期后的日期*/  
is   
enddate date :=startdate+deferDay;--延期后的日期  
holiday_num number:=0;--节假日天数  
weekend_num number:=0;--周末天数  
nonework_num number :=0;--非工作日天数  
begin  
 
 --获取周末天数  
 weekend_num:=weekend_count(startdate,enddate);  
 --获取节假日天数  
  select nvl(count(1),0) into holiday_num from holiday a where a.hl_date is not null and a.hl_date > startdate and a.hl_date <= enddate;
   
 nonework_num:=weekend_num+holiday_num;  
 if nonework_num !=0 then  
    enddate :=getDeferDate(enddate,nonework_num);  
 
 end if;  
 return enddate;  
end;  
第四步:实际应用,如下:
Sql代码  
select getdeferdate(sysdate,5)  deferdate from dual;  
 
 结果如下:
    DEFERDATE
1 2012-9-4 16:12:53


0 0
原创粉丝点击