1. 程式人生 > >oracle計算一個日期加上指定工作日(排除週六週日和一系列節假日)時間

oracle計算一個日期加上指定工作日(排除週六週日和一系列節假日)時間

第一步: 建立一個表格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