Detta kan uppnås med en enkel underfråga som räknar antalet semesterdatum mellan ett angivet datum och datum+5. Följande kommer att returnera ett datum som är fem helgfria dagar i framtiden:
testdate+(select 5+count(1)
from holiday
where holidaydate between testdate
and testdate + 5)
Ändra helt enkelt båda "5" så att ett annat nummer för att ändra utvärderingsperioden.
Redigera - Baserat på kommentaren nedan utvärderas inte min kod några dagar efter den femte dagen. Detta skulle förmodligen vara mycket enklare med en funktion, men följande cte-baserade kod fungerar också:
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
Detta skript bygger en kalendertabell så att den kan utvärdera varje dag (helgdag eller icke-helgdag); då får vi en löpande räkning av helgfria dagar och använder den sjätte.