sql >> Base de Datos >  >> RDS >> Oracle

¿Cómo encontrar valores de formato TIMESTAMP de diferencia b / w en Oracle?

El resultado de la aritmética de marcas de tiempo es un tipo de datos INTERVALO. Tienes un INTERVALO DÍA A SEGUNDO ahí...

Si desea la cantidad de minutos, una forma sería usar EXTRACT() , por ejemplo:

select extract( minute from interval_difference ) * 60 
        + extract( hour from interval_difference ) * 60
        + extract( day from interval_difference ) * 60 * 24
  from ( select systimestamp - (systimestamp - 1) as interval_difference
           from dual )

Alternativamente, puedes usar un truco con las fechas:

select sysdate + (interval_difference * 1440) - sysdate
  from (select systimestamp - (systimestamp - 1) as interval_difference
          from dual )

La versión "trucada" funciona debido al orden de precedencia de los operadores y las diferencias entre la aritmética de la fecha y la marca de tiempo.

Inicialmente, la operación se ve así:

date + ( interval * number ) - date

Como se menciona en la documentación:

Oracle evalúa las expresiones dentro de los paréntesis antes de evaluar las que están fuera.

Entonces, la primera operación la realizó para multiplicar el intervalo por 1.440. Un intervalo, es decir, un período de tiempo discreto, multiplicado por un número es otro período de tiempo discreto, consulte la documentación sobre aritmética de intervalos y fecha y hora. Entonces, el resultado de esta operación es un intervalo, dejándonos con:

date + interval - date

El operador más tiene prioridad sobre el menos aquí. La razón de esto podría ser que un intervalo menos una fecha es una operación no válida, pero la documentación también implica que este es el caso (no sale y lo dice). Entonces, la primera operación realizada es fecha + intervalo. Una fecha más un intervalo es una fecha. Dejando solo

date - date

Según la documentación, esto da como resultado un número entero que representa el número de días. Sin embargo, multiplicó el intervalo original por 1440, por lo que ahora representa 1440 veces la cantidad de días que tendría de otra manera. Luego te queda la cantidad de segundos.

Vale la pena señalar que:

Cuando los cálculos de intervalo devuelven un valor de fecha y hora, el resultado debe ser un valor de fecha y hora real o la base de datos devuelve un error. Por ejemplo, las siguientes dos declaraciones devuelven errores:

El método "truco" podrá fallará, rara vez, pero seguirá fallando. Como siempre, es mejor hacerlo correctamente.