Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como encontrar valores de formato TIMESTAMP diferença b/w no Oracle?


O resultado da aritmética de timestamp é um tipo de dados INTERVAL. Você tem um DIA DE INTERVALO A SEGUNDO aí...

Se você quiser o número de minutos, uma maneira seria usar EXTRACT() , por exemplo:
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, você pode usar um truque com datas:
select sysdate + (interval_difference * 1440) - sysdate
  from (select systimestamp - (systimestamp - 1) as interval_difference
          from dual )

A versão "truque" funciona devido à ordem de precedência do operador e às diferenças entre a aritmética de data e hora.

Inicialmente a operação fica assim:
date + ( interval * number ) - date

Conforme mencionado na documentação:

O Oracle avalia as expressões dentro dos parênteses antes de avaliar as que estão fora.

Então, a primeira operação executou para multiplicar o intervalo por 1.440. Um intervalo, ou seja, um período de tempo discreto, multiplicado por um número é outro período de tempo discreto, consulte a documentação sobre data e hora e aritmética de intervalo. Assim, o resultado desta operação é um intervalo, deixando-nos com:
date + interval - date

O operador mais tem precedência sobre o menos aqui. A razão para isso pode ser que um intervalo menos uma data é uma operação inválida, mas a documentação também implica que esse é o caso (não diga isso). Assim, a primeira operação realizada é data + intervalo. Uma data mais um intervalo é uma data. Deixando apenas
date - date

De acordo com a documentação, isso resulta em um número inteiro representando o número de dias. No entanto, você multiplicou o intervalo original por 1.440, então isso agora representava 1.440 vezes a quantidade de dias que teria. Você fica então com o número de segundos.

Vale a pena notar que:

Quando os cálculos de intervalo retornam um valor de data e hora, o resultado deve ser um valor de data e hora real ou o banco de dados retorna um erro. Por exemplo, as próximas duas instruções retornam erros:

O método "truque" vai falhar, raramente, mas ainda falhará. Como sempre, é melhor fazê-lo corretamente.