Oracle 计算工时除去节假日

前提条件:DIM_oa_TIME 包含每一天,并且is_work=1 工作日 =0 非工作日



create
or replace function getworktime(begindate in date,enddate in date) return number as v_begindate date; v_enddate date; v_nextdate date;--下一天0时 v_date date;--当天0时 beforeworkhournum number(10,2);--开始时间育当天24点两时间相差几个小时 endworkhournum number(10,2);--结束时间与当天0点两时间相差几个小时 workhournum number(10,2);--两时间相差几个小时 workdaynum number(10,2);--两时间相差几个整天工作日 daynum number(10,2);--两时间相差几个整天 is_work int;--是否为非工作日 begin v_begindate :=begindate; v_enddate :=enddate; v_nextdate :=To_date(To_char(Trunc(v_begindate+1), yyyy/mm/dd hh24:mi:ss), yyyy/mm/dd hh24:mi:ss);-- 开始日期的下一天0时 v_date :=To_date(To_char(Trunc(v_enddate), yyyy/mm/dd hh24:mi:ss), yyyy/mm/dd hh24:mi:ss);-- 结束日期的当天0时 beforeworkhournum :=0; endworkhournum :=0; workhournum :=0; workdaynum :=0; daynum :=0; if v_begindate>v_enddate --开始日期大于结束日期时 then workhournum :=0; end if; if to_number(To_date(To_char(v_begindate, yyyy/mm/dd), yyyy/mm/dd hh24:mi:ss)-To_date(To_char(v_enddate, yyyy/mm/dd), yyyy/mm/dd hh24:mi:ss))=0 --开始日期和结束日期时为同一天 then select count(*) into is_work from DIM_oa_TIME where fdate=To_date(To_char(v_begindate, yyyy/mm/dd), yyyy/mm/dd hh24:mi:ss) and is_work =1; --这天是否节假日 if is_work=0 then workhournum :=0;-- 等同于workhournum =workhournum+0 else workhournum := round(to_number(v_enddate-v_begindate)*24,2); end if; else select count(*) into is_work from DIM_oa_TIME where fdate=To_date(To_char(v_begindate, yyyy/mm/dd), yyyy/mm/dd hh24:mi:ss) and is_work =1; --开始日期是否节假日 if is_work=0 then beforeworkhournum :=0; else beforeworkhournum :=round(to_number(v_nextdate-v_begindate)*24,2)+beforeworkhournum;-- 开始时间到下一天0时的小时数 end if; select count(*) into is_work from DIM_oa_TIME where fdate=To_date(To_char(v_enddate, yyyy/mm/dd), yyyy/mm/dd hh24:mi:ss) and is_work =1; --结束日期是否节假日 if is_work=0 then endworkhournum :=0; else endworkhournum :=round(to_number(v_enddate-v_date)*24,2)+endworkhournum;-- 下一天0时到结束时间的小时数 end if; select count(*) into workdaynum from DIM_oa_TIME where fdate>=v_begindate and fdate<=v_enddate and is_work=1; --工作日相差天数 daynum :=to_date(To_char(v_enddate, yyyy/mm/dd),yyyy/mm/dd) - to_date(To_char(v_begindate, yyyy/mm/dd),yyyy/mm/dd); --工作日相差天数 if daynum=workdaynum then workdaynum :=workdaynum-1; end if; end if; workhournum:=workdaynum*24+endworkhournum+beforeworkhournum+workhournum; return workhournum; end; ---select getworktime(to_date(‘2020-01-15 15:23:58‘,‘yyyy-mm-dd hh24:mi:ss‘),to_date(‘2020-01-16 17:57:48‘,‘yyyy-mm-dd hh24:mi:ss‘)) from dual;

 

Oracle 计算工时除去节假日

上一篇:mysql 字段操作


下一篇:mybatis注解开发动态sql