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

Oracle zeigt mehr als 24 Stunden an

Sie müssen den Zeitunterschied in seine Bestandteile Tag, Stunde, Minute und Sekunde zerlegen, die Anzahl der Tage * 24 mit der Anzahl der Stunden kombinieren und wieder zusammenfügen.

Wenn Sie Datumsangaben subtrahieren, erhalten Sie die Differenz als Anzahl der Tage, also müssen Sie den Bruchteil in die anderen Elemente umwandeln, was Sie mit einer Kombination aus trunc und mod tun können; Verwenden Sie einen CTE, um dies etwas einfacher zu verfolgen, und zeigen Sie jeden Wert einzeln sowie in einer einzigen Zeichenfolge kombiniert an:

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 

Sie könnten die Daten für die Berechnung auch in Zeitstempel umwandeln, wodurch Sie einen Intervalltyp erhalten, und dann den extract verwenden Funktion, um stattdessen die Elemente zu erhalten; Das Prinzip ist jedoch dasselbe:

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 

Oder eine kleine Variation, indem man die Differenz aus den Daten erhält und diese dann in ein Intervall umwandelt:

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

SQL Fiddle-Demo.