计算2个时间之间的工作日天数 是否假日表t_sys_holiday 节假日可以自己配置
程序员文章站
2022-05-18 16:05:03
...
以下为ORACLE存储过程实现
create or replace function func_getWorldNum(in_date date,--开始时间
end_date date, --结束时间
d_type varchar2 --日期类型G工作日,Z自然日
) return integer IS
/************************************************************
计算2个时间之间的工作日天数
是否假日表t_sys_holiday
节假日可以自己配置
************************************************************/
Result integer;
d_num int;
begin
--工作日
if d_type = 'G' then
select count(1) into d_num
from (select to_date(t.year || '-' || t.month || '-' || t.day,
'yyyy-mm-dd') atime,
t.type
from T_SYS_HOLIDAY t) a
where a.atime >= in_date-1 and a.atime <= decode(end_date,null,sysdate,end_date)
and a.type = 0;
end if;
--自然日
if d_type = 'Z' then
select count(1) into d_num
from (select to_date(t.year || '-' || t.month || '-' || t.day,
'yyyy-mm-dd') atime,
t.type
from T_SYS_HOLIDAY t) a
where a.atime >= in_date-1 and a.atime <=decode(end_date,null,sysdate,end_date);
--and a.type = 1
end if;
Result:=d_num;
return(Result);
end func_getWorldNum;
---------------------------------------
t_sys_holiday表数据生成
select Datetime,week,isholiday from (
select to_char(TO_DATE('2037-12-30','yyyy-MM-dd') - level, 'yyyy-MM-dd') Datetime ,to_char(TO_DATE('2037-12-30','yyyy-MM-dd') - level, 'd') week,
decode(to_char(TO_DATE('2037-12-30','yyyy-MM-dd') - level, 'd'),
2,0,
3,0,
4,0,
5,0,
6,0,
7,1,
1,1) isholiday
from dual
connect by level <= trunc(TO_DATE('2037-12-30','yyyy-MM-dd') - TO_DATE('1990-01-01','yyyy-MM-dd'))
) --where DOW not in (7, 1);
---节假日管理自己配置修改HOLIDAY表的字段ishokiday为1代表是