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

dotaz oracle na seskupení rozdílu data podle hodiny

V zásadě k vyřešení tohoto problému potřebujete pouze seznam čísel.

with nums as (
      select 0.0 as n from dual
      union all
      select n + 1
      from nums
      where n < 100
    )
select trunc(t.startdate + n * 1/ 24, 'hh'),
       sum((case when trunc(t.startdate + n * 1/24, 'hh') = trunc(t.startdate, 'hh')
                 then 60 - extract(minute from startdate)
                 else 0
            end) +
           (case when trunc(t.startdate + n * 1/24, 'hh') > trunc(t.startdate, 'hh') and
                      trunc(t.startdate + n * 1/24, 'hh') < trunc(t.enddate, 'hh')
                 then 60
                 else 0
            end) +
           (case when trunc(t.startdate + n * 1/24, 'hh') = trunc(t.enddate, 'hh')
                 then extract(minute from enddate)
                 else 0
            end)
           ) as minutes
from table t join
     nums n
     where trunc(t.startdate + n * 1/24, 'hh') <= t.enddate;

To funguje až 100 hodin rozdílu v datech. Můžete upravit 100 pro vaše potřeby. K získání správné maximální hodnoty můžete dokonce použít poddotaz.

Existuje několik triků, které mohou zjednodušit logiku. Myslím, že výše uvedená logika je nejjasnější. Točí se po hodinách. Pokud je porovnávaná hodina první hodinou, použijte 60 minut. Pokud poslední, použijte minuty. V opačném případě použijte 60.



  1. Sqlalchemy vrací zastaralé řádky?

  2. PostgreSQL, komplexní dotaz pro výpočet přísad podle receptury

  3. Chyba SQL:1054, SQLState:42S22 Neznámý sloupec v 'seznamu polí' chyba Java Spring Boot Chyba Mysql

  4. Příkaz ALTER TABLE byl v konfliktu