客户有个需求,需要计算两个时间差,且去除周末。
网上搜了下,只有精确到天的,无法精确到秒。顿时自己写了个函数,放在这边做为分享。
create or replace function workday_between(
i_startTime varchar2, //开始时间
i_endTime varchar2 //结束时间
)
return number
is
v_real_startTime date;
v_real_endTime date;
v_number number;
dayTemp char;
zmno number;
begin
if i_endTime = ' '
then
v_number := 0;
return v_number;
end if;
v_real_startTime := to_date(i_startTime,'YYYY-MM-DD HH24:MI:SS');
v_real_endTime := to_date(i_endTime,'YYYY-MM-DD HH24:MI:SS');
select to_char(v_real_startTime,'d') into dayTemp from dual; //计算开始时间是属于周几
if dayTemp = '7'
then v_real_startTime:=trunc(v_real_startTime+2,'dd'); //如果是周六置为下周一的0点
elsif dayTemp = '1'
then v_real_startTime:=trunc(v_real_startTime+1,'dd'); //如果是周日同样置为下周一的0点
end if;
select to_char(v_real_endTime,'d') into dayTemp from dual; //计算结束时间是属于周几
if dayTemp = '7'
then v_real_endTime:=trunc(v_real_endTime,'dd'); //如果是周六置为本周六的0点
elsif dayTemp = '1'
then v_real_endTime:=trunc(v_real_endTime-1,'dd'); //同上
end if;
if v_real_startTime >= v_real_endTime //判断下开始时间是否大于结束时间,如果大于,返回0
then
v_number := 0;
return v_number;
end if;
select count(1) into zmno from (
select (select to_char(v_real_startTime + num - 1,'d') from dual) as datano
from (select rownum as num from obj)
where v_real_startTime + num - 1 < v_real_endTime
) t where t.datano in ('7', '1'); //计算开始时间结束时间属于周末的天数
v_number := v_real_endTime - v_real_startTime - zmno; //获得时间差
return v_number;
end;
/