sql >> Databáze >  >> RDS >> Oracle

najděte čas, který uplynul mezi dvěma daty v Oracle SQL

Když odečtete dvě DATE hodnoty jako enddate - startdate dostanete rozdíl ve dnech s desetinnou přesností, takže například 1,5 by znamenalo 1 1/2 dne nebo 36 hodin. Můžete to převést na HH:MI:SS používá hodně matematiky, ale jednodušší způsob je převést desetinnou hodnotu na INTERVAL DAY TO SECOND hodnotu pomocí NUMTODSINTERVAL funkce:

  NUMTODSINTERVAL(enddate - startdate, 'DAY')

Mysleli byste si, že TO_CHAR funkce by to dokázala naformátovat jako HH:MI:SS , ale zdá se, že to tak nefunguje. Můžete použít EXTRACT místo toho a TO_CHAR abyste se ujistili, že dostanete úvodní nuly:

 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 část kódu formátu určuje dvě číslice, v případě potřeby s úvodní nulou. FM část se zbaví úvodní mezery ve formátovaném výsledku, která je v případě potřeby vyhrazena pro záporné znaménko.

Všimněte si také, že váš dotaz získává agregované hodnoty a používá je ve stejném SELECT seznam. Oracle vám to nedovolí. Zkuste místo toho něco takového:

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. Neočekávané SQL dotazy do databáze Postgres na Rails/Heroku

  2. možnosti příkazu case rozdělené na dva výstupní sloupce

  3. Rozdělit pole na menší pole na základě hodnoty klíče?

  4. Rozdělit řetězec s novým řádkem a přidat pole v PL sql Oracle