Aqui está uma maneira de fazer o cálculo - SEM usar uma tabela de calendário. Os únicos dados de entrada são os que vêm da sua primeira tabela (ID e HIRE_DATE), que incluí em uma cláusula WITH (não faz parte da consulta que responde à sua pergunta!). Todo o resto é calculado. Mostro como calcular o número de dias INCLUINDO a data de contratação; se você não precisar disso, subtraia 1 no final.
TRUNC(<date>, 'iw')
é a segunda-feira da semana de <date>
. A consulta calcula quantos dias há na semana da MOE, entre segunda-feira e MOE, mas não mais que 5 (caso a MOE seja um sábado ou domingo). Ele faz um cálculo semelhante para HIRE_DATE, mas conta os dias de segunda a HIRE_DATE excluindo DATA DE CONTRATAÇÃO. A última parte é adicionar 5 dias para cada semana completa entre a segunda-feira de HIRE_DATE e a segunda-feira de 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