Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Alternativ für die Dekodierungsfunktion

Dies kann mit einer einfachen Unterabfrage erreicht werden, die die Anzahl der Feiertage zwischen einem bestimmten Datum und Datum+5 zählt. Folgendes gibt ein Datum zurück, das fünf Nicht-Feiertagestage in der Zukunft liegt:

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

Ändern Sie einfach beide „5“ in eine andere Zahl, um den Bewertungszeitraum zu ändern.

SQLFiddle hier

Bearbeiten - Basierend auf dem Kommentar unten wertet mein Code keine Tage nach dem fünften Tag aus. Dies wäre wahrscheinlich mit einer Funktion viel einfacher, aber der folgende cte-basierte Code wird auch funktionieren:

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   

Dieses Skript erstellt eine Kalendertabelle, damit es jeden Tag (Feiertage oder Nicht-Feiertage) auswerten kann; dann erhalten wir eine laufende Zählung der Tage ohne Feiertage und verwenden den sechsten.

SQLFiddle hier