Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Wyświetlacz Oracle ponad 24 godziny

Musisz rozłożyć różnicę czasu na elementy składające się z dnia, godziny, minuty i sekundy, połączyć liczbę dni * 24 z liczbą godzin i skleić ją z powrotem.

Odejmując daty, otrzymujesz różnicę jako liczbę dni, więc musisz przekonwertować część ułamkową na inne elementy, co możesz zrobić za pomocą kombinacji trunc i mod; użycie CTE, aby nieco ułatwić śledzenie i pokazanie każdej wartości osobno, a także w połączeniu w jeden ciąg:

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 

Możesz także przekonwertować daty na znaczniki czasu do obliczeń, co daje typ interwału, a następnie użyć extract funkcja, aby zamiast tego pobrać elementy; zasada jest taka sama:

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 

Lub niewielka zmiana, pobranie różnicy z dat, a następnie przekształcenie jej w interwał:

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

Demo SQL Fiddle.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak sprawdzić, czy istnieje procedura składowana?

  2. Wybierz liczbę (*) z wielu tabel

  3. Metody ustawiania parametrów NLS i ich priorytetów (baza danych Oracle)

  4. 3 sposoby sprawdzania typu danych kolumny w Oracle

  5. Błędy Addnode resolv.conf