Това може да се постигне с проста подзаявка, която отчита броя на празничните дати между определена дата и дата+5. Следното ще върне дата, която е пет непразнични дни в бъдещето:
testdate+(select 5+count(1)
from holiday
where holidaydate between testdate
and testdate + 5)
Просто променете двете "5" с друго число, за да промените периода на оценка.
Редактиране - въз основа на коментара по-долу, моят код не оценява нито един ден след петия ден. Това вероятно би било много по-лесно с функция, но следният базиран на cte код също ще работи:
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
Този скрипт изгражда календарна таблица, така че да може да оценява всеки ден (празничен или непразничен); след това получаваме текущ брой непразнични дни и използваме шестия.