sql >> Database teknologi >  >> RDS >> Oracle

find den forløbne tid mellem to datoer i oracle sql

Når du trækker to DATE fra værdier som enddate - startdate du får forskellen i dage med decimals nøjagtighed, så for eksempel 1,5 ville betyde 1 1/2 dag eller 36 timer. Du kan konvertere det til HH:MI:SS bruger meget matematik, men en nemmere måde er at konvertere decimalværdien til en INTERVAL DAY TO SECOND værdi ved hjælp af NUMTODSINTERVAL funktion:

  NUMTODSINTERVAL(enddate - startdate, 'DAY')
 

Du skulle tro, at TO_CHAR funktion ville være i stand til at formatere dette som HH:MI:SS , men det ser ikke ud til at virke sådan. Du kan bruge EXTRACT i stedet og TO_CHAR for at sikre, at du får indledende nuller:

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 af formatkoden angiver to cifre, med et indledende nul, hvis det er nødvendigt. FM del slipper af med det førende mellemrum i det formaterede resultat, som er reserveret til et negativt fortegn, hvis det er nødvendigt.

Bemærk også, at din forespørgsel får samlede værdier og bruger dem i den samme SELECT liste. Oracle vil ikke lade dig gøre dette. Prøv noget som dette i stedet:

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. laravel veltalende forhold fra forespørgselsbygger

  2. MySql C++ connector getString() virker ikke korrekt, mens getInt fungerer perfekt

  3. Cross Database Query i PostgreSQL

  4. Hvad gør SQL Server med en timeout-anmodning?