sql >> Database >  >> RDS >> Oracle

Converteer lokale datetime (met tijdzone) naar een Unix-tijdstempel in Oracle

U kunt uw tijdstempel met tijdzone converteren naar UTC en vervolgens het tijdperk daarvan aftrekken:

select timestamp '2018-10-19 09:12:47.0 AMERICA/DENVER'
  - timestamp '1970-01-01 00:00:00.0 UTC' as diff
from dual;

waarmee u een intervalgegevenstype krijgt:

DIFF                  
----------------------
+17823 15:12:47.000000

Je kunt dan de elementen daaruit extraheren en elk element vermenigvuldigen met een geschikte factor om het om te zetten in milliseconden (d.w.z. voor dagen, 60*60*24*1000); en voeg ze vervolgens samen:

select extract(day from diff) * 86400000
  + extract(hour from diff) * 3600000
  + extract(minute from diff) * 60000
  + extract(second from diff) * 1000 as unixtime
from (
  select timestamp '2018-10-19 09:12:47.0 AMERICA/DENVER'
    - timestamp '1970-01-01 00:00:00.0 UTC' as diff
  from dual
);

            UNIXTIME
--------------------
       1539961967000

db<>fiddle

Dit bewaart ook milliseconden, als de starttijdstempel ze heeft (dit wordt geconverteerd van een 'Unix'-tijd terwijl ze behouden blijven):

select (timestamp '1970-01-01 00:00:00.0 UTC' + (1539961967567 * interval '0.001' second))
  at time zone 'America/Denver' as denver_time
from dual;

DENVER_TIME                                 
--------------------------------------------
2018-10-19 09:12:47.567000000 AMERICA/DENVER

dan om terug te converteren:

select extract(day from diff) * 86400000
  + extract(hour from diff) * 3600000
  + extract(minute from diff) * 60000
  + extract(second from diff) * 1000 as unixtime
from (
  select timestamp '2018-10-19 09:12:47.567 AMERICA/DENVER'
    - timestamp '1970-01-01 00:00:00.0 UTC' as diff
  from dual
);

            UNIXTIME
--------------------
       1539961967567

db<>fiddle

Als uw starttijdstempel een grotere nauwkeurigheid heeft, moet u afkappen (of rond/vloer/ceil/cast) om te voorkomen dat u een niet-geheel resultaat krijgt; deze versie kapt gewoon het geëxtraheerde deel van milliseconden af:

select diff,
  extract(day from diff) * 86400000
  + extract(hour from diff) * 3600000
  + extract(minute from diff) * 60000
  + trunc(extract(second from diff) * 1000) as unixtime
from (
  select timestamp '2018-10-19 09:12:47.123456789 AMERICA/DENVER'
    - timestamp '1970-01-01 00:00:00.0 UTC' as diff
  from dual
);

DIFF                                  UNIXTIME
------------------------- --------------------
+17823 15:12:47.123456789        1539961967123

Zonder die truncatie (of equivalent) zou je eindigen met 1539961967123.456789 .

Ik was het verschil in schrikkelseconden vergeten; als je dat nodig hebt/wilt, zie dit antwoord .



  1. #1064 -Je hebt een fout in je SQL-syntaxis; controleer de handleiding die overeenkomt met uw MySQL-serverversie

  2. Twee stdClass-objecten vergelijken

  3. Match tegen gebruiken in mysql

  4. Wordt de ruimte die wordt ingenomen door verwijderde rijen opnieuw gebruikt?