Je moet het tijdsverschil uit elkaar halen in de samenstellende dag-, uur-, minuut- en tweede-elementen, het aantal dagen * 24 combineren met het aantal uren, en het weer bij elkaar plakken.
Bij het aftrekken van datums krijg je het verschil als het aantal dagen, dus je moet het fractionele deel converteren naar de andere elementen, wat je kunt doen met een combinatie van trunc en mod; een CTE gebruiken om dit iets gemakkelijker te volgen te maken en elke waarde op zijn eigen en gecombineerd in een enkele string te tonen:
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
U kunt de datums ook converteren naar tijdstempels voor de berekening, waardoor u een intervaltype krijgt, en vervolgens het extract
gebruiken functie om in plaats daarvan de elementen te krijgen; de hoofdsom is echter hetzelfde:
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
Of een kleine variatie, het verschil krijgen van de datums en dat vervolgens omzetten in een interval:
with y as (
select id,
numtodsinterval(end_time - start_time, 'DAY') as runtime
from mytable
)
...
SQL Fiddle-demo.