¿Cómo puedo calcular la diferencia de tiempo en milisegundos entre dos marcas de tiempo en Oracle?
Al restar dos variables de tipo TIMESTAMP
, se obtiene un INTERVALO DÍA A SEGUNDO
que incluye un número de milisegundos y/o microsegundos dependiendo de la plataforma. Si la base de datos se ejecuta en Windows, systimestamp
generalmente tendrá milisegundos. Si la base de datos se ejecuta en Unix, systimestamp
tendrá generalmente microsegundos.
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
Puede utilizar la función EXTRACT
para extraer los elementos individuales de un INTERVALO DÍA A SEGUNDO
.
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
A continuación, puede convertir cada uno de esos componentes en milisegundos y sumarlos
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, sin embargo, es más útil tener la representación INTERVALO DE DÍA A SEGUNDO
o tener columnas separadas para las horas, los minutos, los segundos, etc. en lugar de calcular el número total de milisegundos entre dos 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;
Idioma: sql -->
Select date1 - (date2 - 1) * 24 * 60 *60 * 1000 from Table;