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

encuentre el tiempo transcurrido entre dos fechas en Oracle sql

Cuando restas dos DATE valores como enddate - startdate obtiene la diferencia en días con precisión decimal, por lo que, por ejemplo, 1,5 significaría 1 1/2 días o 36 horas. Puedes convertir eso a HH:MI:SS usando muchas matemáticas, pero una forma más fácil es convertir el valor decimal a un INTERVAL DAY TO SECOND valor usando el NUMTODSINTERVAL función:

  NUMTODSINTERVAL(enddate - startdate, 'DAY')

Uno pensaría que el TO_CHAR la función podría formatear esto como HH:MI:SS , pero no parece funcionar de esa manera. Puedes usar EXTRACT en su lugar, y TO_CHAR para asegurarse de obtener ceros a la izquierda:

 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')

El 00 parte del código de formato especifica dos dígitos, con un cero inicial si es necesario. La FM parte se deshace del espacio inicial en el resultado formateado, que se reserva para un signo negativo si es necesario.

También tenga en cuenta que su consulta obtiene valores agregados y los usa en el mismo SELECT lista. Oracle no te permitirá hacer esto. Prueba algo como esto en su lugar:

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