oracle計算一個日期加上指定工作日(排除週六週日和一系列節假日)時間
阿新 • • 發佈:2019-02-17
第一步:
建立一個表格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 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
'備註';
第二步:寫個函式用以獲取兩個日期之間的週末天數,如下: 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