sql >> Databasteknik >  >> RDS >> Oracle

hitta den tid som har förflutit mellan två datum i oracle sql

När du subtraherar två DATE värden som enddate - startdate du får skillnaden i dagar med decimal noggrannhet, så till exempel 1,5 skulle betyda 1 1/2 dag eller 36 timmar. Du kan konvertera det till HH:MI:SS använder mycket matematik, men ett enklare sätt är att konvertera decimalvärdet till ett INTERVAL DAY TO SECOND värde med NUMTODSINTERVAL funktion:

  NUMTODSINTERVAL(enddate - startdate, 'DAY')

Man skulle kunna tro TO_CHAR funktionen skulle kunna formatera detta som HH:MI:SS , men det verkar inte fungera så. Du kan använda EXTRACT istället och TO_CHAR för att se till att du får inledande nollor:

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

00 en del av formatkoden anger två siffror, med en inledande nolla om det behövs. FM del blir av med det inledande utrymmet i det formaterade resultatet, som reserveras för ett negativt tecken om det behövs.

Observera också att din fråga får samlade värden och använder dem i samma SELECT lista. Oracle låter dig inte göra detta. Prova något liknande istället:

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. Hur visar jag bilder från MySQL-databas i ett JavaScript-bildskjutreglage?

  2. hur man använder LINQ till SQL med mySQL

  3. Synkronisera offline SQLite databas med online MySQL databas

  4. hur kan jag ändra främmande nyckel?