Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Zählen Sie die Tage zwischen zwei Segmenten

Hier ist eine Möglichkeit, die Berechnung durchzuführen - OHNE eine Kalendertabelle zu verwenden. Die einzigen Eingabedaten stammen aus Ihrer ersten Tabelle (ID und HIRE_DATE), die ich in eine WITH-Klausel aufgenommen habe (nicht Teil der Abfrage, die Ihre Frage beantwortet!). Alles andere wird berechnet. Ich zeige, wie man die Anzahl der Tage berechnet, INKLUSIVE des Einstellungsdatums; wenn du das nicht brauchst, subtrahiere 1 am Ende.

TRUNC(<date>, 'iw') ist der Montag der Woche von <date> . Die Abfrage berechnet, wie viele Tage in der EOM-Woche zwischen Montag und EOM liegen, aber nicht mehr als 5 (falls EOM ein Samstag oder Sonntag sein kann). Es führt eine ähnliche Berechnung für HIRE_DATE durch, aber es zählt die Tage von Montag bis HIRE_DATE ausgenommen ANSTELLUNGSDATUM. Der letzte Teil fügt 5 Tage für jede volle Woche zwischen dem Montag des HIRE_DATE und dem Montag des EOM hinzu.

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