Anda perlu memisahkan perbedaan waktu menjadi elemen hari, jam, menit, dan detik penyusunnya, menggabungkan jumlah hari * 24 dengan jumlah jam, dan menyatukannya kembali.
Saat mengurangkan tanggal, Anda mendapatkan selisih sebagai jumlah hari, jadi Anda perlu mengubah bagian pecahan menjadi elemen lain, yang dapat Anda lakukan dengan kombinasi trunc dan mod; menggunakan CTE untuk membuat ini sedikit lebih mudah diikuti dan menunjukkan setiap nilai sendiri serta digabungkan menjadi satu string:
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
Anda juga dapat mengonversi tanggal menjadi stempel waktu untuk penghitungan, yang memberi Anda jenis interval, lalu menggunakan extract
berfungsi untuk mendapatkan elemen sebagai gantinya; pokoknya sama aja:
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
Atau sedikit variasi, dapatkan perbedaan dari tanggal dan kemudian ubah menjadi interval:
with y as (
select id,
numtodsinterval(end_time - start_time, 'DAY') as runtime
from mytable
)
...
Demo SQL Fiddle.