Hoe bereken ik het tijdsverschil in milliseconden tussen twee timestamps in Oracle?
Wanneer je twee variabelen van het type TIMESTAMP
aftrekt, krijg je een INTERVAL DAG TOT SECONDE
die een aantal milliseconden en/of microseconden bevat, afhankelijk van het platform. Als de database op Windows draait, zal systimestamp
over het algemeen milliseconden bevatten. Als de database op Unix draait, zal systimestamp
over het algemeen microseconden bevatten.
1 select systimestamp - to_timestamp( '2012-07-23', 'yyyy-mm-dd' )
2* from dual
SQL> /
SYSTIMESTAMP-TO_TIMESTAMP('2012-07-23','YYYY-MM-DD')
---------------------------------------------------------------------------
+000000000 14:51:04.339000000
U kunt de EXTRACT
functie gebruiken om de individuele elementen van een INTERVAL DAG TOT SECONDE
uit te pakken
SQL> ed
Wrote file afiedt.buf
1 select extract( day from diff ) days,
2 extract( hour from diff ) hours,
3 extract( minute from diff ) minutes,
4 extract( second from diff ) seconds
5 from (select systimestamp - to_timestamp( '2012-07-23', 'yyyy-mm-dd' ) diff
6* from dual)
SQL> /
DAYS HOURS MINUTES SECONDS
---------- ---------- ---------- ----------
0 14 55 37.936
Je kunt dan elk van deze componenten omzetten in milliseconden en ze optellen
SQL> ed
Wrote file afiedt.buf
1 select extract( day from diff )*24*60*60*1000 +
2 extract( hour from diff )*60*60*1000 +
3 extract( minute from diff )*60*1000 +
4 round(extract( second from diff )*1000) total_milliseconds
5 from (select systimestamp - to_timestamp( '2012-07-23', 'yyyy-mm-dd' ) diff
6* from dual)
SQL> /
TOTAL_MILLISECONDS
------------------
53831842
Normaal gesproken is het echter nuttiger om ofwel de INTERVAL DAG TOT SECONDE
weergave te hebben of aparte kolommen voor uren, minuten, seconden, enz. in plaats van het totaal aantal milliseconden tussen twee TIMESTAMP
waarden te berekenen.
SELECT numtodsinterval(date1-date2,'day') time_difference from dates;
SELECT (extract(DAY FROM time2-time1)*24*60*60)+
(extract(HOUR FROM time2-time1)*60*60)+
(extract(MINUTE FROM time2-time1)*60)+
extract(SECOND FROM time2-time1)
into diff FROM dual;
RETURN diff;
Select date1 - (date2 - 1) * 24 * 60 *60 * 1000 from Table;