गणना करने का एक तरीका यहां दिया गया है - कैलेंडर तालिका का उपयोग किए बिना। एकमात्र इनपुट डेटा वह है जो आपकी पहली तालिका (आईडी और HIRE_DATE) से आता है, जिसे मैंने खंड के साथ शामिल किया है (आपके प्रश्न का उत्तर देने वाली क्वेरी का हिस्सा नहीं!)। बाकी सब की गणना की जाती है। मैं दिखाता हूं कि किराये की तारीख सहित दिनों की संख्या की गणना कैसे करें; अगर आपको इसकी आवश्यकता नहीं है, तो अंत में 1 घटाएं।
TRUNC(<date>, 'iw')
<date>
. के सप्ताह का सोमवार है . क्वेरी गणना करती है कि ईओएम सप्ताह में सोमवार और ईओएम के बीच कितने दिन हैं, लेकिन 5 से अधिक नहीं (यदि ईओएम शनिवार या रविवार हो सकता है)। यह HIRE_DATE के लिए समान गणना करता है, लेकिन यह सोमवार से HIRE_DATE तक छोड़कर के दिनों की गणना करता है चुनने की तारीख। अंतिम भाग HIRE_DATE के सोमवार और EOM के सोमवार के बीच प्रत्येक पूरे सप्ताह के लिए 5 दिन जोड़ रहा है।
with
sample_data(id, hire_date) as (
select 1, to_date('09/26/2018', 'mm/dd/yyyy') from dual union all
select 2, to_date('07/10/2018', 'mm/dd/yyyy') from dual
)
select id, to_char(hire_date, 'Dy mm/dd/yyyy') as hire_date,
to_char(eom, 'Dy mm/dd/yyyy') as eom,
least(5, eom - eom_mon + 1) - least(5, hire_date - hire_mon)
+ (eom_mon - hire_mon) * 5 / 7 as workdays
from (
select id, hire_date, last_day(hire_date) as eom,
trunc(hire_date, 'iw') as hire_mon,
trunc(last_day(hire_date), 'iw') as eom_mon
from sample_data
)
;
ID HIRE_DATE EOM WORKDAYS
---------- ----------------------- ----------------------- ----------
1 Wed 09/26/2018 Sun 09/30/2018 3
2 Tue 07/10/2018 Tue 07/31/2018 16