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

Výsledek formátu odčítání času

Když odečtete jedno časové razítko od druhého, výsledkem je datový typ interního intervalu, ale můžete s ním zacházet jako s „intervalem ze dne na sekundu“:

select
(localtimestamp - to_timestamp(us.STARTDATETIME,'hh24:mi:ss')) as HoursPassed
from random us;

HOURSPASSED        
-------------------
+08 15:26:54.293892

'+08' (v mém časovém pásmu relace) je počet dní, nikoli offset UTC; to je hodnota, protože když převedete řetězec na datum nebo časové razítko a poskytnete pouze časovou část, datová část se jako výchozí použije na první den aktuálního měsíce:

Výchozí hodnoty data jsou určeny následovně:

  • Rok je aktuální rok podle SYSDATE.
  • Měsíc je aktuální měsíc podle SYSDATE.
  • Den je 01 (první den v měsíci).
  • Hodina, minuta a sekunda jsou všechny 0.

Tyto výchozí hodnoty se používají v dotazu, který požaduje hodnoty data, kde samotné datum není zadáno ...

Takže opravdu srovnávám:

select localtimestamp, to_timestamp(us.STARTDATETIME,'hh24:mi:ss')
from random us;

LOCALTIMESTAMP             TO_TIMESTAMP(US.STARTDATET
-------------------------- --------------------------
2017-08-09 23:26:54.293892 2017-08-01 08:00:00.000000

Interval nelze přímo formátovat, ale můžete extrahovat prvky času a formátovat je samostatně a zřetězit je.

select to_char(extract(hour from (localtimestamp
    - to_timestamp(us.STARTDATETIME, 'hh24:mi:ss'))), 'FM00')
  ||':'|| to_char(extract(minute from (localtimestamp
    - to_timestamp(us.STARTDATETIME, 'hh24:mi:ss'))), 'FM00')
  ||':'|| to_char(extract(second from (localtimestamp
    - to_timestamp(us.STARTDATETIME, 'hh24:mi:ss'))), 'FM00')
  as hourspassed
from random us;

HOURSPASSED
-----------
15:26:54

Opakované počítání stejného intervalu vypadá trochu plýtvavě a obtížně se spravuje, takže to můžete udělat v inline zobrazení nebo CTE:

with cte (diff) as (
  select localtimestamp - to_timestamp(us.STARTDATETIME, 'hh24:mi:ss')
  from random us
)
select to_char(extract(hour from diff), 'FM00')
  ||':'|| to_char(extract(minute from diff), 'FM00')
  ||':'|| to_char(extract(second from diff), 'FM00')
  as hourspassed
from cte;

HOURSPASSED
-----------
15:26:54

Můžete také použít data místo časových razítek; odečtením pak získáte rozdíl jako číslo s celými a zlomkovými dny:

select current_date - to_date(us.STARTDATETIME, 'hh24:mi') as hourspassed
from random us;

HOURSPASSED
-----------
 8.64368056

Nejjednodušší způsob formátování je přidat jej ke známému půlnočnímu času a poté použít to_char() :

select to_char(date '1970-01-01'
  + (current_date - to_date(us.STARTDATETIME, 'hh24:mi')),
  'HH24:MI:SS') as hourspassed
from random us;

HOURSPAS
--------
15:26:54

Zůstal jsem u current_date jako nejbližší shoda s localtimestamp; možná budete chtít systimestamp a/nebo sysdate . (Více o rozdílu zde.)




  1. Jak formátovat čísla s čárkami na serveru SQL

  2. Jak se vyhnout chybě dělení nulou v SQL?

  3. Jak zvýšit maximální počet připojení v postgresu?

  4. Přihlašovací postup v R12.2 a základní odstraňování problémů