Aquí hay una forma de hacer el cálculo, SIN usar una tabla de calendario. Los únicos datos de entrada son los que provienen de su primera tabla (ID y HIRE_DATE), que incluí en una cláusula WITH (¡no forma parte de la consulta que responde a su pregunta!). Todo lo demás está calculado. Muestro cómo calcular el número de días INCLUYENDO la fecha de contratación; si no lo necesita, reste 1 al final.
TRUNC(<date>, 'iw')
es el lunes de la semana de <date>
. La consulta calcula cuántos días hay en la semana de la EOM, entre el lunes y la EOM, pero no más de 5 (en caso de que la EOM sea un sábado o un domingo). Hace un cálculo similar para HIRE_DATE, pero cuenta los días desde el lunes hasta HIRE_DATE excluyendo FECHA DE CONTRATACIÓN. La última parte es agregar 5 días por cada semana completa entre el lunes de HIRE_DATE y el lunes 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