0

一連の休日の詳細をリストする「休日」テーブルがあります。日付を指定すると、指定した日付の 5 日後に結果の日付を取得する必要があります。その間に休日がある場合は、それらを除外し、非休日の日付を表示する必要があります。 .休日の日付、休日の種類|(毎週の休日、地方の休日)を含む、休日という名前のテーブルがあります。今、連続した休日のチェックにネストされたデコードを使用しました。ケース関数でこれを変更する方法を教えてください。

DECODE
               (date,
                holidaydate, DECODE
                   (date + 1,
                    holidaydate + 1, DECODE
                       (date + 2,
                        holidaydate + 2, DECODE
                           (date + 3,holidaydate+3,date+4,date+3),date+2),date+1),date);
4

3 に答える 3

4

これは、指定された日付と日付 + 5 の間の休日の日付の数をカウントする単純なサブクエリで実現できます。次の例では、休日を除く 5 日間先の日付が返されます。

testdate+(select 5+count(1) 
            from holiday
           where holidaydate between testdate
                                 and testdate + 5)

評価期間を変更するには、両方の「5」を別の数字に変更するだけです。

ここで SQLFiddle

編集- 以下のコメントに基づいて、私のコードは 5 日目以降は評価されません。これはおそらく関数を使用するとはるかに簡単になりますが、次の cte ベースのコードも機能します。

with cte as ( (select alldate,holidaydate 
                 from (select to_date('20130101','yyyymmdd')+level alldate 
                         from dual 
                       connect by level < 10000 -- adjust for period to evaluate
                      ) alldates 
                      left join holiday on alldate=holidaydate) )
select 
    testdate,test_plus_five
from ( 
    select 
        alldate test_plus_five,testdate,
        sum(case when holidaydate is null 
                 then 1 
                 else 0 end) over (partition by testdate order by alldate) lastday 
    from 
        cte,
        testdates
    where
        alldate >= testdate
    group by
        alldate,holidaydate,testdate)
where
    lastday = 6   

このスクリプトは、カレンダー テーブルを作成して、毎日 (休日または非休日) を評価できるようにします。次に、非休日の実行中のカウントを取得し、6 番目の日付を使用します。

ここで SQLFiddle

于 2013-08-20T12:26:19.153 に答える
0

最後に、最適な解決策を見つけました。回答してくれてありがとう。SELECT dt FROM (SELECT dt FROM (SELECT TO_DATE('15-AUG-2013','dd-mon-yyyy')+LEVEL dt FROM DUAL CONNECT BY LEVEL < 30)
WHERE (SELECT COUNT (*) FROM mst_holiday WHERE holidaydate = dt) = 0 ) where rownum=1

于 2013-08-23T03:50:20.210 に答える