sql >> Base de Datos >  >> RDS >> Oracle

Contar días entre dos segmentos

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