计算工作日的功能

此函数以2个日期作为参数,并返回工作日数。 您需要添加假期列表。 (我添加了一些作为示例)


CREATE OR REPLACE FUNCTION BUSINESS_DAYS (
  i_Date1 IN DATE,
  i_Date2 IN DATE
  )
RETURN NUMBER
IS
  V_LEAST          DATE := TRUNC(LEAST(i_Date1, i_Date2));
  V_GREATEST       DATE := TRUNC(GREATEST(i_Date1, i_Date2));
  V_RESULT         NUMBER; 
  V_FIRST_DOWK     NUMBER;
  V_LAST_DOWK      NUMBER;
  V_WKS_BTWN       NUMBER;
  V_SAT_ADJST      NUMBER := 0;
  V_COUNT_FIRST    NUMBER := 1;
  V_PLS            PLS_INTEGER := 1;
BEGIN 
  V_FIRST_DOWK := TO_NUMBER( TO_CHAR(V_LEAST, 'D' ) );
  V_LAST_DOWK := TO_NUMBER( TO_CHAR(V_GREATEST, 'D' ) );
  V_WKS_BTWN := TRUNC( (V_GREATEST - V_LEAST ) / 7 ); 
  IF V_FIRST_DOWK > V_LAST_DOWK
  THEN
     V_WKS_BTWN := V_WKS_BTWN + 1;
  END IF; 
  IF V_FIRST_DOWK = 7
  THEN
    V_SAT_ADJST := 1;
    V_COUNT_FIRST := 0;
  ELSIF V_FIRST_DOWK = 1
  THEN
    V_COUNT_FIRST := 0;
  ELSE
     NULL;
  END IF; 
  IF V_LAST_DOWK = 7
  THEN
     V_SAT_ADJST := V_SAT_ADJST - 1;
  END IF; 
  V_RESULT := ((V_WKS_BTWN * 5 ) + (V_LAST_DOWK - V_FIRST_DOWK + V_COUNT_FIRST) + V_SAT_ADJST) * V_PLS; 
  IF V_RESULT > 0
  THEN
 --FOR 2007  
 --FOR 2008  
 --FOR 2009 
 IF TO_DATE('01-01-2009','DD-MM-YYYY') BETWEEN i_Date1 AND i_Date2
    THEN
      V_RESULT := V_RESULT - 1;
    END IF; 
 IF TO_DATE('19-03-2009','DD-MM-YYYY') BETWEEN i_Date1 AND i_Date2
    THEN
      V_RESULT := V_RESULT - 1;
    END IF; 
 IF TO_DATE('15-07-2009','DD-MM-YYYY') BETWEEN i_Date1 AND i_Date2
    THEN
      V_RESULT := V_RESULT - 1;
    END IF;
----------------------------------------------------------
------------------add more dates here-----------
---------------------------------------------------------- 
  RETURN V_RESULT;
/*
EXCEPTION
  WHEN OTHERS
  THEN
    V_ERROR := TO_CHAR(SQLERRM);
--    INSERT INTO CHARAN(NAME, Dt)
--    VALUES(V_ERROR || ' - ' || i_Date1 || ' & ' || i_Date2, SYSDATE);
--    COMMIT;
--    RAISE_APPLICATION_ERROR('-20001', 'Oops. Invalid Date format. It should be "DD-MON-YYYY"');
    RAISE_APPLICATION_ERROR('-20001', TO_CHAR(SQLERRM) || ' - ' || i_Date1 || ' & ' || i_Date2);
*/
END;  

From: https://bytes.com/topic/oracle/insights/871071-function-calculate-business-days

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值