Oracle'da iki zaman damgası arasındaki zaman farkını milisaniye cinsinden nasıl hesaplayabilirim?
TIMESTAMPtipindeki iki değişkeni çıkardığınızda, platforma bağlı olarak bir dizi milisaniye ve/veya mikrosaniye içeren bir
INTERVAL DAY TO SECONDelde edersiniz. Veritabanı Windows üzerinde çalışıyorsa,
systimestampgenellikle milisaniye değerine sahip olacaktır. Veritabanı Unix üzerinde çalışıyorsa,
systimestamp` genellikle mikrosaniye değerine sahip olacaktır.
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
Bir INTERVAL DAY TO SECOND
öğesini tek tek çıkarmak için EXTRACT
işlevini kullanabilirsiniz.
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
Daha sonra bu bileşenlerin her birini milisaniyeye dönüştürebilir ve toplayabilirsiniz
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
Ancak normalde, iki TIMESTAMP
değeri arasındaki toplam milisaniye sayısını hesaplamak yerine INTERVAL DAY TO SECOND
gösterimine sahip olmak ya da saat, dakika, saniye vb. için ayrı sütunlara sahip olmak daha kullanışlıdır.
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;