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

trouver le temps écoulé entre deux dates dans oracle sql

Lorsque vous soustrayez deux DATE des valeurs comme enddate - startdate vous obtenez la différence en jours avec une précision décimale, donc par exemple 1,5 signifierait 1 1/2 jours ou 36 heures. Vous pouvez le convertir en HH:MI:SS en utilisant beaucoup de maths, mais un moyen plus simple consiste à convertir la valeur décimale en un INTERVAL DAY TO SECOND valeur en utilisant NUMTODSINTERVAL fonction :

  NUMTODSINTERVAL(enddate - startdate, 'DAY')

Vous penseriez que le TO_CHAR la fonction serait capable de formater ceci comme HH:MI:SS , mais cela ne semble pas fonctionner de cette façon. Vous pouvez utiliser EXTRACT à la place, et TO_CHAR pour vous assurer d'obtenir des zéros non significatifs :

 TO_CHAR(EXTRACT(HOUR FROM NUMTODSINTERVAL(enddate-startdate, 'DAY')), 'FM00')
   || ':' ||
 TO_CHAR(EXTRACT(MINUTE FROM NUMTODSINTERVAL(enddate-startdate, 'DAY')), 'FM00')
   || ':' ||
 TO_CHAR(EXTRACT(SECOND FROM NUMTODSINTERVAL(enddate-startdate, 'DAY')), 'FM00')

Le 00 une partie du code de format spécifie deux chiffres, avec un zéro en tête si nécessaire. La FM partie se débarrasse de l'espace de début dans le résultat formaté, qui est réservé pour un signe négatif si nécessaire.

Notez également que votre requête obtient des valeurs agrégées et les utilise dans le même SELECT liste. Oracle ne vous laissera pas faire cela. Essayez quelque chose comme ceci à la place :

WITH StartEndByID AS (
  SELECT
    msglog.id,
    NUMTODSINTERVAL(max(msglog.timestamp) - min(msglog.timestamp), 'DAY') elapsed
  FROM messagelog msglog
  GROUP BY id
)
SELECT
  id,
  TO_CHAR(EXTRACT(HOUR FROM elapsed), 'FM00') || ':' ||
    TO_CHAR(EXTRACT(MINUTE FROM elapsed), 'FM00') || ':' ||
    TO_CHAR(EXTRACT(SECOND FROM elapsed), 'FM00') AS ElapsedHHMISS
FROM StartEndByID