Bạn cần tách chênh lệch thời gian thành các yếu tố ngày, giờ, phút và giây cấu thành của nó, kết hợp số ngày * 24 với số giờ và gắn chúng lại với nhau.
Khi trừ ngày, bạn nhận được sự khác biệt dưới dạng số ngày, vì vậy bạn cần chuyển phần phân số thành các phần tử khác, điều này bạn có thể thực hiện với sự kết hợp của trunc và mod; sử dụng CTE để làm cho việc theo dõi này dễ dàng hơn một chút và hiển thị từng giá trị riêng cũng như được kết hợp thành một chuỗi duy nhất:
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
Bạn cũng có thể chuyển đổi ngày tháng thành dấu thời gian để tính toán, cung cấp cho bạn loại khoảng thời gian và sau đó sử dụng extract
hàm để lấy các phần tử thay thế; mặc dù hiệu trưởng vẫn giống nhau:
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
Hoặc một biến thể nhỏ, nhận sự khác biệt so với các ngày và sau đó chuyển đổi đó thành một khoảng thời gian:
with y as (
select id,
numtodsinterval(end_time - start_time, 'DAY') as runtime
from mytable
)
...
Bản trình diễn SQL Fiddle.