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

OracleSQLに営業日を追加する

    あなたはこれを試すことができます:

    select max(date_field_two) as date_field_two
      from
     (
     select date'2018-08-30'+  
        cast(case when to_char(date'2018-08-30'+level,'D','NLS_DATE_LANGUAGE=ENGLISH') 
                                                  in ('6','7') then 
                0
              else
                level
              end as int) as date_field_two, 
     sum(cast(case when to_char(date'2018-08-30'+level,'D','NLS_DATE_LANGUAGE=ENGLISH')  
                                                   in ('6','7') then 
                0
              else
                1
              end as int)) over (order by level) as next_day
          from dual
        connect by level <= 20*1.5 
    -- 20 is the day to be added, every time 5(#of business days)*1.5 > 7(#of week days)
    -- 7=5+2<5+(5/2)=5*(1+1/2)=5*1.5 [where 1.5 is just a coefficient might be replaced a greater one like 2]
    -- so 4*5*1.5=20*1.5 > 4*7 
      )    
     where next_day = 20;
    
     DATE_FIELD_TWO
    -----------------
       27.09.2018
    

    connect by dualを使用する 条項。

    追伸週末のみに関連する質問に応じて、文化ごとに異なる祝日の場合は無視しました。

    Rextesterデモ

    編集: '2018-09-25'と'2018-09-26'(この一連の日)に国民の祝日があると仮定して、次のことを考慮してください:

    select max(date_field_two) as date_field_two
      from
     (
     select date'2018-08-30'+  
            (case when to_char(date'2018-08-30'+level,'D','NLS_DATE_LANGUAGE=ENGLISH') 
                                                  in ('6','7') then 
                   0
                  when date'2018-08-30'+level in (date'2018-09-25',date'2018-09-26') then
                   0
                  else
                   level
                  end) as date_field_two, 
     sum(cast(case when to_char(date'2018-08-30'+level,'D','NLS_DATE_LANGUAGE=ENGLISH')  
                                                   in ('6','7') then 
                    0
                   when date'2018-08-30'+level in (date'2018-09-25',date'2018-09-26') then
                    0 
                   else
                    1
                   end as int)) over (order by level) as next_day
          from dual
        connect by level <= 20*2 
      )    
     where next_day = 20;
    
     DATE_FIELD_TWO
    -----------------
       01.10.2018
    

    この休日が週末と一致しない限り、この場合のように、次の日に繰り返されます。



    1. LEFTJOINを含む4つのテーブルを重複せずに結合します

    2. シーケンスに関するpostgresqlnextvalの質問

    3. Postgresqlのフォーマット日付

    4. 2つのテーブルの結合SQL