Dit kan worden bereikt met een eenvoudige subquery die het aantal vakantiedata telt tussen een bepaalde datum en date+5. Het volgende geeft een datum terug die vijf niet-vakantiedagen in de toekomst ligt:
testdate+(select 5+count(1)
from holiday
where holidaydate between testdate
and testdate + 5)
Verander eenvoudig beide "5"-en, dus een ander nummer om de evaluatieperiode te wijzigen.
Bewerken - op basis van onderstaande opmerking evalueert mijn code geen dagen na de vijfde dag. Dit zou waarschijnlijk veel gemakkelijker zijn met een functie, maar de volgende op cte gebaseerde code zal ook werken:
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
Dit script bouwt een kalendertabel zodat het elke dag kan evalueren (vakantie of niet-vakantie); dan krijgen we een lopende telling van niet-vakantiedagen en gebruiken we de zesde.