Ceci peut être réalisé avec une simple sous-requête qui compte le nombre de dates de vacances entre une date spécifiée et date+5. Ce qui suit renverra une date située cinq jours non fériés dans le futur :
testdate+(select 5+count(1)
from holiday
where holidaydate between testdate
and testdate + 5)
Changez simplement les deux "5" en un autre chiffre pour modifier la période d'évaluation.
Modifier - basé sur le commentaire ci-dessous, mon code n'évalue aucun jour après le cinquième jour. Ce serait probablement beaucoup plus facile avec une fonction, mais le code suivant basé sur cte fonctionnera également :
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
Ce script construit une table de calendrier afin qu'il puisse évaluer chaque jour (jour férié ou non); puis nous obtenons un décompte des jours non fériés et utilisons le sixième.