Thật không may là ... Tuy nhiên, có một mẹo đơn giản nếu nó sẽ ít hơn 24 giờ.
Oracle giả định rằng một số được thêm vào một ngày là theo ngày. Chuyển đổi số giây thành ngày. Thêm ngày hiện tại, sau đó sử dụng to_date
chức năng để lấy chỉ những phần quan tâm của bạn trong Giả sử bạn có x
giây:.
select to_char(sysdate + (x/(60 * 60 * 24)), 'HH24:MI:SS')
from dual
này sẽ không hoạt động nếu có nhiều hơn 24 tiếng đồng hồ, mặc dù bạn có thể loại bỏ các hiện dữ liệu một lần nữa và nhận được sự khác biệt trong ngày, giờ, phút và giây.
Nếu bạn muốn một cái gì đó như: 51:10:05
, tức là 51 giờ, 10 phút và 5 giây thì bạn sẽ phải sử dụng trunc
.
Một lần nữa giả định rằng bạn có x
giây ...
- Số giờ là
trunc(x/60/60)
- Số phút là
trunc((x - (trunc(x/60/60) * 60 * 60))/60)
- Số giây do đó là
x - hours * 60 * 60 - minutes * 60
Rời khỏi bạn với:
with hrs as (
select x, trunc(x/60/60) as h
from dual
)
, mins as (
select x, h, trunc((x - h * 60 * 60)/60) as m
from hrs
)
select h, m, x - (h * 60 * 60) - (m * 60)
from mins
Tôi đã thiết lập SQL Fiddle để minh họa.
Điều này hoạt động tốt. Nhưng nếu giờ> 99 giờ thì nó không hoạt động chính xác – user1430989
Xem bản chỉnh sửa của tôi bằng TO_CHAR thay vì LPAD. Nó sẽ xử lý lên đến 9999 giờ ngay bây giờ. Nếu bạn cần nhiều hơn thế, bạn có thể thêm số 9 vào chuỗi định dạng trong hàm TO_CHAR đầu tiên. – Mike
Đây không phải là chính xác cho trường hợp dưới đây: SELECT TO_CHAR (TRUNC (76014000/3600), 'FM999999900') || 'Hrs' || TO_CHAR (TRUNC (MOD (76014000,3600)/60), 'FM00') || 'Min' TỪ DUAL; –