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.