sql >> Databáze >  >> RDS >> Oracle

Počítejte dny mezi dvěma segmenty

Zde je jeden způsob, jak provést výpočet - BEZ použití kalendářní tabulky. Jedinými vstupními daty jsou data z vaší první tabulky (ID a HIRE_DATE), kterou jsem zahrnul do klauzule WITH (není součástí dotazu, který odpovídá na vaši otázku!). Vše ostatní se počítá. Ukazuji, jak vypočítat počet dní VČETNĚ data pronájmu; pokud to nepotřebujete, odečtěte 1 na konci.

TRUNC(<date>, 'iw') je pondělí v týdnu <date> . Dotaz počítá, kolik dní je v týdnu EOM mezi pondělím a EOM, ale ne více než 5 (v případě, že EOM může být sobota nebo neděle). Provádí podobný výpočet pro HIRE_DATE, ale počítá dny od pondělí do HIRE_DATE kromě HIRE_DATE. Poslední částí je přidání 5 dnů za každý celý týden mezi pondělím HIRE_DATE a pondělím 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


  1. Získejte první znaky z řetězce

  2. mysql - Vytváření výkonu řádků vs. sloupců

  3. MySQL najde duplikáty na základě jiné hodnoty sloupce

  4. Úplné obnovení clusteru MySQL nebo MariaDB Galera ze zálohy