sql >> データベース >  >> RDS >> Oracle

oraclesqlで週末と祝日を除く日付差のカスタム関数を作成します

    週の日数を取得するために、行ジェネレーターを使用して毎日を列挙する必要はありません。簡単な計算を使用して実行できます。

    ここでの私の答えから:

    CREATE FUNCTION getWorkingDays (
      in_start_date IN  DATE,
      in_end_date   IN  DATE
    ) RETURN NUMBER DETERMINISTIC
    IS
      p_start_date   DATE;
      p_end_date     DATE;
      p_working_days NUMBER;
      p_holiday_days NUMBER;
    BEGIN
      IF in_start_date IS NULL OR in_end_date IS NULL THEN
        RETURN NUll;
      END IF;
    
      p_start_date := LEAST( in_start_date, in_end_date );
      p_end_date   := GREATEST( in_start_date, in_end_date );
    
      -- 5/7 * ( Number of days between monday of the week containing the start date
      --         and monday of the week containing the end date )
      -- + LEAST( day of week for end date, 5 )
      -- - LEAST( day of week for start date, 5 )
      p_working_days := ( TRUNC( p_end_date, 'IW' ) - TRUNC( p_start_date, 'IW' ) ) * 5 / 7
                        + LEAST( p_end_date - TRUNC( p_end_date, 'IW' ), 5 )
                        - LEAST( p_start_date - TRUNC( p_start_date, 'IW' ), 5 );
    
      SELECT COALESCE(
               SUM(
                 LEAST( p_end_date, holiday_date + INTERVAL '1' DAY )
                 - GREATEST( p_start_date, holiday_date )
               ),
               0
             )
      INTO   p_holiday_days
      FROM   Holidays
      WHERE  HOLIDAY_DATE BETWEEN TRUNC( p_start_date )
                          AND     TRUNC( p_end_date )
      AND    HOLIDAY_DATE - TRUNC( HOLIDAY_DATE, 'IW' ) < 5;
    
      RETURN GREATEST( p_working_days - p_holiday_days, 0 );
    END;
    /
    



    1. 列数が行1の値数と一致しません

    2. Amazon RDS(MySQLまたはMariaDB)をオンプレミスサーバーに移行する

    3. SQL ServerのPARSE()とCAST()とCONVERT()の違い:違いは何ですか?

    4. リンクサーバーエラーのトラップ