0

番号の計算方法を教えてください。週末と特定の祝日を除く、開始日から終了日までの営業日数。以下で説明するように、開始日、終了日、および休日のリストを含むカスタム休日テーブルを使用するとします。

開始日 (mm/dd/yyyy hh24:mi:ss) : '10/15/2012 08:00:00'

終了日 (mm/dd/yyyy hh24:mi:ss) : '10/23/2012 10:30:00'

holiday_table.business_holiday_date の値 (mm/dd/yyyy) :

2012 年 10 月 17 日

2012 年 10 月 19 日

2012/10/22

計算で日付の時間部分を考慮して営業日を計算する必要があります (したがって、分数のある営業日も期待できます。例: 1.25、3.7 など)

この至急で私を助けていただければ幸いです。

-ジェームズ

4

2 に答える 2

0

試す:

SELECT(end_date - start_date) - 
(select count(*) 
 from holiday_table 
 where business_holiday_date >= start_date
 and business_holiday_date <= end_date)
FROM dual

ここにフィドルがあります

于 2012-10-21T09:42:26.927 に答える
0

2 つの日付のみを使用する関数がありますが、改善できます。どうぞ...

  1. まず、週末を除いて休日テーブルに何日入ったかを確認します。
  2. 2 つの日付の間の営業日 (月曜日から金曜日) を取得し、その後、休日の日を差し引きます。

    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;
    

その後、次のようにテストできます。

    select 
            calculate_business_days('21-AUG-2013','28-AUG-2013') as business_days 
    from dual;
于 2013-08-21T15:11:51.687 に答える