Điều này có thể đạt được bằng một truy vấn con đơn giản, đếm số ngày nghỉ giữa một ngày cụ thể và ngày + 5. Phần sau sẽ trả về một ngày là năm ngày không nghỉ trong tương lai:
testdate+(select 5+count(1)
from holiday
where holidaydate between testdate
and testdate + 5)
Chỉ cần thay đổi cả hai "5" thành một số khác để thay đổi khoảng thời gian đánh giá.
Chỉnh sửa - dựa trên bình luận bên dưới, mã của tôi không đánh giá bất kỳ ngày nào sau ngày thứ năm. Điều này có lẽ sẽ dễ dàng hơn nhiều với một hàm, nhưng mã dựa trên cte sau đây cũng sẽ hoạt động:
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
Tập lệnh này xây dựng một bảng lịch để nó có thể đánh giá từng ngày (kỳ nghỉ hoặc không nghỉ lễ); sau đó chúng tôi nhận được số ngày không phải ngày lễ và sử dụng số ngày thứ sáu.