第一步:
创建一个表格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;
压缩包里有2个文件,用于
计算
两个
日期
相差的
工作日
天数(
排除
周末和法定
节假日
):
1、excel表为2023年日历数据,并且备注
工作日
、周末,调休、
节假日
类型,可导入数据库。
2、SQL文件为2023年所有
日期
的插入SQL,并标注:
工作日
、法定
节假日
、
节假日
调休的上班日 、周末的类型。
3、已重新更正5月6日调休。
这个结果是oralce数据库根据
周六
周日
是休息日,周一至周五为
工作日
,这个逻辑来判断的,如果要作为实际的
工作日
、休息日、
节假日
的判断,还应在这个基础上进行调整,这个SQL可以生成初始化
节假日
数据表格。MOD函数用来求两个数值相除后的余数,这里巧妙运用每天的星期数对6取余运算,只有1和7对6取余后结果为1,1和7正好代表
周日
和
周六
,所以当结果为1表示‘休息日’,否则表示‘
工作日
’。判断2023-1-1到2023-12-31这一年的
时间
,哪些属于
工作日
,哪些属于休息日。
文章目录1 概述2 示例2.1 判断双休日2.2 判断
节假日
#mermaid-svg-RiNPbI034v08DBcc .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-RiNPbI034v08DBcc .label text{fill:#333}#mermaid-svg-RiNPbI034v08DBc
create or replace function workday_between(
i_startTime varchar2, //开始
时间
i_endTime varchar2 //结束
时间
return number
v_real_startTime date;
v_real_endTime date;
v_number number...
select rownum,nt_date,case when dd=7 then '星期日' else '星期六' end holiddate from(
select to_date('2021-01-01','yyyy-mm-dd')+rownum nt_date,to_char(to_date('2021-01-01','yyyy-mm-dd')+rownum,'D') dd from dual
connect by to_char(to_date('2021-01-01','yyyy-mm-.
create or replace function get_workday(starTime in date,endTime in date) return numberisWeekends number;Holidays number;Workdays number;begin--统计开始到结束有几天周末select count(*) into Weekends from(SELECT TO_...
项目要求:需要
计算
两个
日期
之间的
工作日
天数,包含元旦、五一、十一等法定假日。
网上查询很多SQL函数,最终发现都不太理想,例如国庆放假可能会调休,周末也要上班。所以唯一的解决方案是建立一张
工作日
时间
表,通过这张表去判断当天是否属于
工作日
。
1、新建一张数据库表,【
工作日
】
上传到CSDN资源了,下载后倒入数据库就可以
https://download.csdn.net/download...