Saat Anda mengurangi dua DATE
nilai seperti enddate - startdate
Anda mendapatkan perbedaan dalam hari dengan akurasi desimal, jadi misalnya 1,5 berarti 1 1/2 hari atau 36 jam. Anda dapat mengonversinya menjadi HH:MI:SS
menggunakan banyak matematika, tetapi cara yang lebih mudah adalah dengan mengubah nilai desimal menjadi INTERVAL DAY TO SECOND
nilai menggunakan NUMTODSINTERVAL
fungsi:
NUMTODSINTERVAL(enddate - startdate, 'DAY')
Anda akan berpikir TO_CHAR
fungsi akan dapat memformat ini sebagai HH:MI:SS
, tetapi tampaknya tidak berfungsi seperti itu. Anda dapat menggunakan EXTRACT
sebagai gantinya, dan TO_CHAR
untuk memastikan Anda mendapatkan angka nol di depan:
TO_CHAR(EXTRACT(HOUR FROM NUMTODSINTERVAL(enddate-startdate, 'DAY')), 'FM00')
|| ':' ||
TO_CHAR(EXTRACT(MINUTE FROM NUMTODSINTERVAL(enddate-startdate, 'DAY')), 'FM00')
|| ':' ||
TO_CHAR(EXTRACT(SECOND FROM NUMTODSINTERVAL(enddate-startdate, 'DAY')), 'FM00')
00
bagian dari kode format menentukan dua digit, dengan nol di depan jika diperlukan. FM
part menghilangkan spasi terdepan dalam hasil yang diformat, yang dicadangkan untuk tanda negatif jika diperlukan.
Perhatikan juga bahwa kueri Anda mendapatkan nilai agregat dan menggunakannya dalam SELECT
. yang sama daftar. Oracle tidak akan membiarkan Anda melakukan ini. Cobalah sesuatu seperti ini sebagai gantinya:
WITH StartEndByID AS (
SELECT
msglog.id,
NUMTODSINTERVAL(max(msglog.timestamp) - min(msglog.timestamp), 'DAY') elapsed
FROM messagelog msglog
GROUP BY id
)
SELECT
id,
TO_CHAR(EXTRACT(HOUR FROM elapsed), 'FM00') || ':' ||
TO_CHAR(EXTRACT(MINUTE FROM elapsed), 'FM00') || ':' ||
TO_CHAR(EXTRACT(SECOND FROM elapsed), 'FM00') AS ElapsedHHMISS
FROM StartEndByID