oracle计算一个日期加上指定工作日(排除周六周日和一系列节假日)时间
2017-05-22 13:54
896 查看
第一步:
创建一个表格holiday用于灵活存放节假日日期(周末除外),如果和周末日期重复,则无需添加到该表格中:
create table T_RENT_HOLIDAY (
ID VARCHAR2(45) not null,
HL_DATE DATE,
HL_DESC VARCHAR2(500),
REMARK VARCHAR2(500),
constraint PK_HOLIDAY primary key (ID)
);
comment on table T_RENT_HOLIDAY is
‘节假日日期表(不含周末)’;
comment on column T_RENT_HOLIDAY.ID is
‘节假日编号’;
comment on column T_RENT_HOLIDAY.HL_DATE is
‘节假日期’;
comment on column T_RENT_HOLIDAY.HL_DESC is
‘假日说明’;
comment on column T_RENT_HOLIDAY.REMARK is
‘备注’;
第二步:写个函数用以获取两个日期之间的周末天数,如下:
create or replace function func_rent_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;
第三步:编写函数用以获取指定日期延迟特定工作日以后的具体日期,如下:
create or replace function func_rent_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 T_RENT_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;
第四步:实际应用,如下:
select func_rent_getDeferDate(sysdate-1,5) deferdate from dual;
创建一个表格holiday用于灵活存放节假日日期(周末除外),如果和周末日期重复,则无需添加到该表格中:
create table T_RENT_HOLIDAY (
ID VARCHAR2(45) not null,
HL_DATE DATE,
HL_DESC VARCHAR2(500),
REMARK VARCHAR2(500),
constraint PK_HOLIDAY primary key (ID)
);
comment on table T_RENT_HOLIDAY is
‘节假日日期表(不含周末)’;
comment on column T_RENT_HOLIDAY.ID is
‘节假日编号’;
comment on column T_RENT_HOLIDAY.HL_DATE is
‘节假日期’;
comment on column T_RENT_HOLIDAY.HL_DESC is
‘假日说明’;
comment on column T_RENT_HOLIDAY.REMARK is
‘备注’;
第二步:写个函数用以获取两个日期之间的周末天数,如下:
create or replace function func_rent_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;
第三步:编写函数用以获取指定日期延迟特定工作日以后的具体日期,如下:
create or replace function func_rent_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 T_RENT_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;
第四步:实际应用,如下:
select func_rent_getDeferDate(sysdate-1,5) deferdate from dual;
相关文章推荐
- oracle计算一个日期加上指定工作日(排除周六周日和一系列节假日)时间
- Java计算加上指定工作日数(排除周六周日和一系列节日)
- Oracle计算指定日期内的工作日(不包含周末)
- Oracle 计算两个日期间时间排除非工作日及非工作时间
- java计算两个日期之前的天数(工作日),排除节假日和周末
- oracle判断一个字符型日期是否在指定范围内
- 已知开始工作时间和工作日期计算工作日结束时间
- Js计算指定日期加上多少天、加多少月、加多少年的日期
- Oracle日期周详解以及周开始结束时间计算
- 计算工作日,根据某一起始日期,加上一定工作日之后得到新日期
- 计算指定工作日后的日期
- oracle获取指定的日期、时间
- 一个时间日期转换格式的小功能(Oracle)
- 实用开发之-oracle表回滚到一个指定时间的操作语句
- JAVA得到一个指定日期范围内每天的开始时间和结束时间
- java的一个日期格式加上指定月数,得到一个新日期(此方法通用)
- ORACLE的时间间隔计算 比如求距某日期时间后30分钟的
- 一个日期的扩展函数库包括计算周次和本周时间范围(javascript)
- Oracle自动导出脚本(WINDOWS停的,导出文件名自动加上日期和时间)
- 计算指定日期的时间间隔