आप इसे आजमा सकते हैं:
select max(date_field_two) as date_field_two
from
(
select date'2018-08-30'+
cast(case when to_char(date'2018-08-30'+level,'D','NLS_DATE_LANGUAGE=ENGLISH')
in ('6','7') then
0
else
level
end as int) as date_field_two,
sum(cast(case when to_char(date'2018-08-30'+level,'D','NLS_DATE_LANGUAGE=ENGLISH')
in ('6','7') then
0
else
1
end as int)) over (order by level) as next_day
from dual
connect by level <= 20*1.5
-- 20 is the day to be added, every time 5(#of business days)*1.5 > 7(#of week days)
-- 7=5+2<5+(5/2)=5*(1+1/2)=5*1.5 [where 1.5 is just a coefficient might be replaced a greater one like 2]
-- so 4*5*1.5=20*1.5 > 4*7
)
where next_day = 20;
DATE_FIELD_TWO
-----------------
27.09.2018
connect by dual
. का उपयोग करके खंड।
पी.एस. सार्वजनिक छुट्टियों के मामले को नजरअंदाज कर दिया, जो एक संस्कृति से दूसरी संस्कृति में भिन्न होता है, यह सवाल केवल सप्ताहांत से संबंधित होने पर निर्भर करता है।
संपादित करें: मान लें कि आपके पास '2018-09-25' और '2018-09-26' (दिनों के इस सेट में) को राष्ट्रीय अवकाश हैं, तो निम्नलिखित पर विचार करें:
select max(date_field_two) as date_field_two
from
(
select date'2018-08-30'+
(case when to_char(date'2018-08-30'+level,'D','NLS_DATE_LANGUAGE=ENGLISH')
in ('6','7') then
0
when date'2018-08-30'+level in (date'2018-09-25',date'2018-09-26') then
0
else
level
end) as date_field_two,
sum(cast(case when to_char(date'2018-08-30'+level,'D','NLS_DATE_LANGUAGE=ENGLISH')
in ('6','7') then
0
when date'2018-08-30'+level in (date'2018-09-25',date'2018-09-26') then
0
else
1
end as int)) over (order by level) as next_day
from dual
connect by level <= 20*2
)
where next_day = 20;
DATE_FIELD_TWO
-----------------
01.10.2018
जो इस मामले में अगले एक दिन पुनरावृति करता है, जब तक कि यह अवकाश सप्ताहांत के साथ मेल नहीं खाता।