oracle自定义函数剔除假期

需求:oracle无法使用数据库情况下剔除春节及十月一假期计算工作日差
解决方案:
--测试
select FN_DURATION('2021-02-09','2021-03-08') from dual

--新建自定义函数
create or replace function FN_DURATION(para1 in varchar2, para2 in varchar2) 
return varchar2 
as 
begin
  if TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss') < TO_DATE('2021-02-06','yyyy-MM-dd hh24-mi-ss') and TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss')<TO_DATE('2021-02-06','yyyy-MM-dd hh24-mi-ss')  
    then return     TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss')-TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss')  ;
          
  elsif (TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss') < TO_DATE('2021-02-06','yyyy-MM-dd hh24-mi-ss') and (TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss') between TO_DATE('2021-02-06','yyyy-MM-dd hh24-mi-ss')  and TO_DATE('2021-03-01','yyyy-MM-dd hh24-mi-ss')))  
    then return  TO_DATE('2021-02-06','yyyy-MM-dd hh24-mi-ss') - TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss');
           
  elsif (TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss') < TO_DATE('2021-02-06','yyyy-MM-dd hh24-mi-ss') and (TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss') between TO_DATE('2021-03-01','yyyy-MM-dd hh24-mi-ss')  and TO_DATE('2021-10-01','yyyy-MM-dd hh24-mi-ss'))) 
    then return   TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss')-TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss')-(TO_DATE('2021-03-01','yyyy-MM-dd hh24-mi-ss')-TO_DATE('2021-02-06','yyyy-MM-dd hh24-mi-ss'))  ;
          
  elsif (TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss') < TO_DATE('2021-02-06','yyyy-MM-dd hh24-mi-ss') and (TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss') between TO_DATE('2021-10-01','yyyy-MM-dd hh24-mi-ss')  and TO_DATE('2021-10-08','yyyy-MM-dd hh24-mi-ss'))) 
    then return   TO_DATE('2021-10-01','yyyy-MM-dd hh24-mi-ss')-TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss')  ;
          
  elsif (TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss') < TO_DATE('2021-02-06','yyyy-MM-dd hh24-mi-ss') and TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss') >TO_DATE('2021-10-08','yyyy-MM-dd hh24-mi-ss'))  
    then return   TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss')-TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss')-(TO_DATE('2021-03-01','yyyy-MM-dd hh24-mi-ss')-2021-02-06)-(TO_DATE('2021-10-08','yyyy-MM-dd hh24-mi-ss')-TO_DATE('2021-10-01','yyyy-MM-dd hh24-mi-ss'))  ;

  elsif ((TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss')  between TO_DATE('2021-02-06','yyyy-MM-dd hh24-mi-ss')   and TO_DATE('2021-03-01','yyyy-MM-dd hh24-mi-ss')) and (TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss') between TO_DATE('2021-02-06','yyyy-MM-dd hh24-mi-ss')  and TO_DATE('2021-03-01','yyyy-MM-dd hh24-mi-ss')))  
    then return   0  ;
          
  elsif ((TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss')  between TO_DATE('2021-02-06','yyyy-MM-dd hh24-mi-ss')   and TO_DATE('2021-03-01','yyyy-MM-dd hh24-mi-ss')) and (TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss') between TO_DATE('2021-03-01','yyyy-MM-dd hh24-mi-ss')  and TO_DATE('2021-10-01','yyyy-MM-dd hh24-mi-ss')))  
    then return   TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss')-TO_DATE('2021-03-01','yyyy-MM-dd hh24-mi-ss')  ;
          
  elsif ((TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss')  between TO_DATE('2021-02-06','yyyy-MM-dd hh24-mi-ss')   and TO_DATE('2021-03-01','yyyy-MM-dd hh24-mi-ss')) and (TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss') between TO_DATE('2021-10-01','yyyy-MM-dd hh24-mi-ss')  and TO_DATE('2021-10-08','yyyy-MM-dd hh24-mi-ss')))  
    then return   TO_DATE('2021-10-01','yyyy-MM-dd hh24-mi-ss')-TO_DATE('2021-03-01','yyyy-MM-dd hh24-mi-ss')  ;
          
  elsif ((TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss')  between TO_DATE('2021-02-06','yyyy-MM-dd hh24-mi-ss')   and TO_DATE('2021-03-01','yyyy-MM-dd hh24-mi-ss')) and TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss') >TO_DATE('2021-10-08','yyyy-MM-dd hh24-mi-ss'))  
    then return   TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss')-TO_DATE('2021-03-01','yyyy-MM-dd hh24-mi-ss')-(TO_DATE('2021-10-08','yyyy-MM-dd hh24-mi-ss')-TO_DATE('2021-10-01','yyyy-MM-dd hh24-mi-ss'))  ;


  elsif ((TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss')  between TO_DATE('2021-03-01','yyyy-MM-dd hh24-mi-ss')   and TO_DATE('2021-10-01','yyyy-MM-dd hh24-mi-ss')) and (TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss') between TO_DATE('2021-03-01','yyyy-MM-dd hh24-mi-ss')  and TO_DATE('2021-10-01','yyyy-MM-dd hh24-mi-ss')))  
    then return   TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss')-TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss')  ;
          
  elsif ((TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss')  between TO_DATE('2021-03-01','yyyy-MM-dd hh24-mi-ss')   and TO_DATE('2021-10-01','yyyy-MM-dd hh24-mi-ss')) and (TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss') between TO_DATE('2021-10-01','yyyy-MM-dd hh24-mi-ss')  and TO_DATE('2021-10-08','yyyy-MM-dd hh24-mi-ss')))  
    then return   TO_DATE('2021-10-01','yyyy-MM-dd hh24-mi-ss')-TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss')  ;
          
  elsif ((TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss')  between TO_DATE('2021-03-01','yyyy-MM-dd hh24-mi-ss')   and TO_DATE('2021-10-01','yyyy-MM-dd hh24-mi-ss')) and TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss') >TO_DATE('2021-10-08','yyyy-MM-dd hh24-mi-ss'))  
    then return   TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss')-TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss')-(TO_DATE('2021-10-08','yyyy-MM-dd hh24-mi-ss')-TO_DATE('2021-10-01','yyyy-MM-dd hh24-mi-ss'))  ;


  elsif ((TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss')  between TO_DATE('2021-10-01','yyyy-MM-dd hh24-mi-ss')   and TO_DATE('2021-10-08','yyyy-MM-dd hh24-mi-ss')) and (TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss') between TO_DATE('2021-10-01','yyyy-MM-dd hh24-mi-ss')  and TO_DATE('2021-10-08','yyyy-MM-dd hh24-mi-ss')))  
    then return   0  ;
  elsif ((TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss')  between TO_DATE('2021-10-01','yyyy-MM-dd hh24-mi-ss')   and TO_DATE('2021-10-08','yyyy-MM-dd hh24-mi-ss')) and TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss') >TO_DATE('2021-10-08','yyyy-MM-dd hh24-mi-ss'))  
    then return   TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss')-TO_DATE('2021-10-08','yyyy-MM-dd hh24-mi-ss')  ;

  elsif (TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss')>TO_DATE('2021-10-08','yyyy-MM-dd hh24-mi-ss') and TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss')>TO_DATE('2021-10-08','yyyy-MM-dd hh24-mi-ss'))   
    then return   TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss')-TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss')  ;     
  end if;
end FN_DURATION;

--删除自定义函数
drop function FN_DURATION;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zkhyzy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值