SQL to return the number of working days between 2 passed in dates

前端 未结 6 1610
礼貌的吻别
礼貌的吻别 2021-01-07 08:10

I need to write an sql query that returns the number of Working days (Monday - Friday) between two given dates.

I was wondering what would be the most efficient way

6条回答
  •  盖世英雄少女心
    2021-01-07 08:54

    Here you go...

    1. First check how many days you got in the holiday table, excluding weekend days.
    2. Get business days (MON to FRI) between the 2 dates and after that subtract the holiday days.

      create or replace
      FUNCTION calculate_business_days (p_start_date IN DATE, p_end_date IN DATE)
              RETURN NUMBER IS
              v_holidays     NUMBER;
              v_start_date   DATE   := TRUNC (p_start_date);
              v_end_date     DATE   := TRUNC (p_end_date);
              BEGIN
              IF v_end_date >= v_start_date
              THEN
                      SELECT COUNT (*)
                      INTO v_holidays
                      FROM holidays
                      WHERE day BETWEEN v_start_date AND v_end_date
                      AND day NOT IN (
                              SELECT hol.day 
                              FROM holidays hol 
                              WHERE MOD(TO_CHAR(hol.day, 'J'), 7) + 1 IN (6, 7)
                      );
      
              RETURN   GREATEST (NEXT_DAY (v_start_date, 'MON') - v_start_date - 2, 0)
                   +   (  (  NEXT_DAY (v_end_date, 'MON')
                           - NEXT_DAY (v_start_date, 'MON')
                          )
                        / 7
                       )
                     * 5
                   - GREATEST (NEXT_DAY (v_end_date, 'MON') - v_end_date - 3, 0)
                   - v_holidays;
              ELSE
                      RETURN NULL;
              END IF;
      END calculate_business_days;
      

    After that you can test it out, like:

        select 
                calculate_business_days('21-AUG-2013','28-AUG-2013') as business_days 
        from dual;
    

提交回复
热议问题