oracle计算时间差去除周末精确到秒

本文介绍了一个自定义函数,用于计算两个时间点之间的差值,并排除周末时间。该函数适用于需要精确工作日时间差的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

客户有个需求,需要计算两个时间差,且去除周末。

网上搜了下,只有精确到天的,无法精确到秒。顿时自己写了个函数,放在这边做为分享。

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;
/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值