Esto se puede lograr con una subconsulta simple que cuenta el número de fechas de vacaciones entre una fecha específica y fecha+5. Lo siguiente devolverá una fecha de cinco días no festivos en el futuro:
testdate+(select 5+count(1)
from holiday
where holidaydate between testdate
and testdate + 5)
Simplemente cambie ambos "5" por otro número para cambiar el período de evaluación.
Editar - según el comentario a continuación, mi código no evalúa ningún día después del quinto día. Esto probablemente sería mucho más fácil con una función, pero el siguiente código basado en cte también funcionará:
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
Este script crea una tabla de calendario para que pueda evaluar cada día (festivo o no festivo); luego obtenemos un conteo continuo de días no festivos y usamos el sexto.