Moje podejście polegałoby na wygenerowaniu stałej liczby dat, począwszy od sysdate -1 malejąco, a następnie pracy nad nimi. W poniższym fragmencie wybrałem 100. Po uzyskaniu właściwej daty użyj jej do filtrowania według tabeli 1.
select dates
from (
select rownum as rn,
dates
from (
select x.dates,
nvl2(h.holiday_from,'T','F') as hd,
decode (to_char(x.dates,'D')-1,6,'T',7,'T','F') as WE
from (
select trunc(sysdate) - rownum as dates
from dual d
connect By rownum <= 100 -- change this number if you plan on having long holidays
) x
left outer join holidays h
on x.dates between h.holiday_fromand h.holiday_to
)
where hd = 'F' and WE = 'F' -- exclude holidays and weekends
)
where rn = 14; -- return the 14th working day from now