Hvordan beregner jeg tidsforskjellen i millisekunder mellom to tidsstempler i Oracle?
Når du trekker fra to variabler av typen TIMESTAMP
, får du INTERVAL DAY TO SECOND
som inkluderer et antall millisekunder og/eller mikrosekunder avhengig av plattformen. Hvis databasen kjører på Windows, vil systimestamp
vanligvis ha millisekunder. Hvis databasen kjører på Unix, vil systimestamp
vanligvis ha mikrosekunder.
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
Du kan bruke funksjonen EXTRACT
for å trekke ut de enkelte elementene i et INTERVAL DAY TO SECOND
.
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
Du kan deretter konvertere hver av disse komponentene til millisekunder og legge dem sammen.
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
Normalt er det imidlertid mer nyttig å ha enten INTERVAL DAY TO SECOND
-representasjonen eller å ha separate kolonner for timer, minutter, sekunder osv. i stedet for å beregne det totale antall millisekunder mellom to TIMESTAMP
-verdier.
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;