sql >> Database >  >> RDS >> Oracle

vind de verstreken tijd tussen twee datums in orakel sql

Wanneer u twee DATE . aftrekt waarden zoals enddate - startdate je krijgt het verschil in dagen met decimale nauwkeurigheid, dus bijvoorbeeld 1,5 zou 1 1/2 dag of 36 uur betekenen. Je kunt dat converteren naar HH:MI:SS met veel wiskunde, maar een eenvoudigere manier is om de decimale waarde om te zetten in een INTERVAL DAY TO SECOND waarde met behulp van de NUMTODSINTERVAL functie:

  NUMTODSINTERVAL(enddate - startdate, 'DAY')

Je zou denken dat de TO_CHAR functie zou dit kunnen formatteren als HH:MI:SS , maar zo lijkt het niet te werken. U kunt EXTRACT . gebruiken in plaats daarvan, en TO_CHAR om ervoor te zorgen dat u voorloopnullen krijgt:

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

De 00 een deel van de formaatcode specificeert twee cijfers, indien nodig met een voorloopnul. De FM part verwijdert de leidende spatie in het opgemaakte resultaat, die indien nodig is gereserveerd voor een minteken.

Houd er ook rekening mee dat uw zoekopdracht geaggregeerde waarden krijgt en deze gebruikt in dezelfde SELECT lijst. Oracle laat je dit niet doen. Probeer in plaats daarvan iets als dit:

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


  1. PDO execute array naar string conversiefout

  2. MySQL:resterende dagen van abonnementen berekenen op basis van betalingen

  3. Fix:"de leidende precisie van het interval is te klein" in Oracle Database

  4. Full-Text Search implementeren in SQL Server 2016 voor geavanceerde gebruikers