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.
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.