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

encontre o tempo decorrido entre duas datas no oracle sql


Quando você subtrai dois DATE valores como enddate - startdate você obtém a diferença em dias com precisão decimal, então, por exemplo, 1,5 significaria 1 1/2 dias ou 36 horas. Você pode converter isso para HH:MI:SS usando muita matemática, mas uma maneira mais fácil é converter o valor decimal em um INTERVAL DAY TO SECOND valor usando o NUMTODSINTERVAL função:
  NUMTODSINTERVAL(enddate - startdate, 'DAY')

Você pensaria que o TO_CHAR função seria capaz de formatar isso como HH:MI:SS , mas não parece funcionar dessa maneira. Você pode usar EXTRACT em vez disso, e TO_CHAR para garantir que você obtenha zeros à esquerda:
 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')

O 00 parte do código de formato especifica dois dígitos, com um zero à esquerda, se necessário. O FM parte se livra do espaço inicial no resultado formatado, que é reservado para um sinal negativo, se necessário.

Observe também que sua consulta obtém valores agregados e os usa no mesmo SELECT Lista. A Oracle não vai deixar você fazer isso. Tente algo assim em vez disso:
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