Como calcular a diferença de tempo em milissegundos entre dois timestamps no Oracle?
Quando você subtrai duas variáveis do tipo TIMESTAMP', você recebe um
INTERVAL DAY TO SECOND' que inclui um número de milissegundos e/ou microssegundos, dependendo da plataforma. Se a base de dados estiver rodando no Windows, o systimestamp
geralmente terá milissegundos. Se a base de dados estiver rodando no Unix, o systimestamp
geralmente terá microssegundos.
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
Você pode utilizar a função "EXTRACT" para extrair os elementos individuais de um `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
Você pode então converter cada um desses componentes em milissegundos e adicioná-los
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
Normalmente, no entanto, é mais útil ter a representação INTERVAL DAY TO SECOND
ou ter colunas separadas para horas, minutos, segundos, etc. em vez de calcular o número total de milissegundos entre dois valores TIMESTAMP
.
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;