Dette kan opnås med en simpel underforespørgsel, som tæller antallet af feriedatoer mellem en angivet dato og dato+5. Følgende vil returnere en dato, der er fem ikke-feriedage i fremtiden:
testdate+(select 5+count(1)
from holiday
where holidaydate between testdate
and testdate + 5)
Du skal blot ændre begge "5" så et andet tal for at ændre evalueringsperioden.
Rediger - baseret på kommentaren nedenfor, evaluerer min kode ikke nogen dage efter den femte dag. Dette ville sandsynligvis være meget nemmere med en funktion, men den følgende cte-baserede kode vil også fungere:
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
Dette script bygger en kalendertabel, så det kan evaluere hver dag (ferie eller ikke-ferie); så får vi en løbende optælling af ikke-feriedage, og bruger den sjette.