Voici une façon de faire le calcul - SANS utiliser une table de calendrier. Les seules données d'entrée sont celles qui proviennent de votre première table (ID et HIRE_DATE), que j'ai incluses dans une clause WITH (ne faisant pas partie de la requête qui répond à votre question !). Tout le reste est calculé. Je montre comment calculer le nombre de jours INCLUANT la date de location ; si vous n'en avez pas besoin, soustrayez 1 à la fin.
TRUNC(<date>, 'iw')
est le lundi de la semaine du <date>
. La requête calcule le nombre de jours dans la semaine EOM, entre lundi et EOM, mais pas plus de 5 (dans le cas où EOM peut être un samedi ou un dimanche). Il effectue un calcul similaire pour HIRE_DATE, mais il compte les jours du lundi au HIRE_DATE excluant DATE D'EMBAUCHE. La dernière partie ajoute 5 jours pour chaque semaine complète entre le lundi HIRE_DATE et le lundi EOM.
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