欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

计算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代表是