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

Oracle displej více než 24 hodin

Musíte rozdělit časový rozdíl na základní prvky dne, hodiny, minuty a sekundy, zkombinovat počet dní * 24 s počtem hodin a dát to dohromady.

Při odečítání dat získáte rozdíl jako počet dní, takže musíte zlomkovou část převést na ostatní prvky, což můžete provést kombinací trunc a mod; pomocí CTE, aby se to trochu snáze sledovalo a aby se každá hodnota zobrazovala samostatně i sloučená do jednoho řetězce:

with y as (
  select id, end_time - start_time as runtime
  from mytable
)
select id,
  runtime,
  trunc(runtime) as days,
  24 * trunc(runtime) as day_hours,
  trunc(24 * mod(runtime, 1)) as hours,
  trunc(60 * mod(24 * (runtime), 1)) as minutes,
  trunc(60 * mod(24 * 60 * (runtime), 1)) as seconds,
  lpad(24 * trunc(runtime)
    + trunc(24 * mod(runtime, 1)), 2, '0')
    ||':'|| lpad(trunc(60 * mod(24 * (runtime), 1)), 2, '0')
    ||':'|| lpad(trunc(60 * mod(24 * 60 * (runtime), 1)), 2, '0')
    as runtime
from y;

        ID    RUNTIME       DAYS  DAY_HOURS      HOURS    MINUTES    SECONDS RUNTIME 
---------- ---------- ---------- ---------- ---------- ---------- ---------- --------
         1 .184918981          0          0          4         26         16 04:26:16 
         2 1.14465278          1         24          3         28         18 27:28:18 

Můžete také převést data na časová razítka pro výpočet, což vám dá typ intervalu, a poté použít extract funkce pro získání prvků místo toho; princip je však stejný:

with y as (
  select id,
    cast(end_time as timestamp) - cast (start_time as timestamp) as runtime
  from mytable
)
select id,
  runtime,
  extract (day from runtime) as days,
  24 * extract (day from runtime) as day_hours,
  extract (hour from runtime) as hours,
  extract (minute from runtime) as minutes,
  extract (second from runtime) as seconds,
  lpad(24 * extract (day from runtime) + extract (hour from runtime), 2, '0')
    ||':'|| lpad(extract (minute from runtime), 2, '0')
    ||':'|| lpad(extract (second from runtime), 2, '0')
    as runtime
from y;

        ID RUNTIME           DAYS  DAY_HOURS      HOURS    MINUTES    SECONDS RUNTIME 
---------- ----------- ---------- ---------- ---------- ---------- ---------- --------
         1 0 4:26:17.0          0          0          4         26         17 04:26:17 
         2 1 3:28:18.0          1         24          3         28         18 27:28:18 

Nebo malá obměna, získání rozdílu z dat a následné převedení na interval:

with y as (
  select id,
    numtodsinterval(end_time - start_time, 'DAY') as runtime
  from mytable
)
...

Ukázka SQL Fiddle.




  1. Získejte n seskupených kategorií a shrňte ostatní do jedné

  2. Jak změnit model obnovy databáze SQL Server pomocí T-SQL

  3. Jak vytvořit dynamické kontingenční tabulky v MySQL

  4. SQL Server Regulární výrazy v T-SQL