Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment trouver la différence entre les valeurs de format TIMESTAMP dans Oracle ?

Le résultat de l'arithmétique d'horodatage est un type de données INTERVAL. Vous avez un INTERVALLE JOUR A SECONDE là...

Si vous voulez le nombre de minutes, une façon serait d'utiliser EXTRACT() , par exemple :

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 )

Sinon, vous pouvez utiliser une astuce avec les dates :

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

La version "astuce" fonctionne en raison de l'ordre de priorité des opérateurs et des différences entre l'arithmétique de la date et de l'horodatage.

Initialement, l'opération ressemble à ceci :

date + ( interval * number ) - date

Comme mentionné dans la documentation :

Oracle évalue les expressions à l'intérieur des parenthèses avant d'évaluer celles à l'extérieur.

Ainsi, la première opération l'a effectuée pour multiplier l'intervalle par 1 440. Un intervalle, c'est-à-dire une période de temps discrète, multipliée par un nombre est une autre période de temps discrète, voir la documentation sur l'arithmétique datetime et intervalle. Ainsi, le résultat de cette opération est un intervalle, nous laissant avec :

date + interval - date

L'opérateur plus a priorité sur le moins ici. La raison en est peut-être qu'un intervalle moins une date est une opération invalide, mais la documentation implique également que c'est le cas (ne sort pas et ne le dit pas). Ainsi, la première opération effectuée est date + intervalle. Une date plus un intervalle est une date. Laissant juste

date - date

Selon la documentation, cela se traduit par un nombre entier représentant le nombre de jours. Cependant, vous avez multiplié l'intervalle d'origine par 1 440, ce qui représente maintenant 1 440 fois le nombre de jours qu'il aurait autrement. Il vous reste alors le nombre de secondes.

Il convient de noter que :

Lorsque les calculs d'intervalle renvoient une valeur datetime, le résultat doit être une valeur datetime réelle ou la base de données renvoie une erreur. Par exemple, les deux instructions suivantes renvoient des erreurs :

La méthode "truc" sera échouer, rarement mais il échouera quand même. Comme toujours, il est préférable de le faire correctement.