Oracle
 sql >> база данни >  >> RDS >> Oracle

Преобразувайте местна дата и час (с часова зона) в времево клеймо на Unix в Oracle

Можете да преобразувате вашето времево клеймо с часова зона в UTC и след това да извадите епохата от това:

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

което ви дава интервален тип данни:

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

След това можете да извлечете елементите от това и да умножите всеки елемент с подходящ фактор, за да го преобразувате в милисекунди (т.е. за дни, 60*60*24*1000); и след това ги добавете заедно:

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<>цигулка

Това запазва и милисекунди, ако началното времево клеймо ги има (това преобразува от време „Unix“, като ги запазва):

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

след това, за да конвертирате обратно:

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

Ако вашето начално времево клеймо има по-голяма точност от тази, тогава ще трябва да отрежете (или кръгъл/подов/таван/отливка), за да избегнете получаването на нецелочислен резултат; тази версия просто съкращава извлечената част от милисекунди:

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

Без това съкращаване (или еквивалент) ще завършите с 1539961967123.456789 .

Бях забравил за несъответствието във високосните секунди; ако имате нужда/искате да се справите с това, вижте този отговор .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Прилагане на филтър в Oracle View

  2. Променете компонента на часовата зона на TIMESTAMP WITH TIMEZONE в Oracle

  3. Наистина ли е по-добре да се използват нормализирани таблици?

  4. Как да копирам или импортирам схеми на Oracle между две различни бази данни на различни сървъри?

  5. Открит е цикъл при изпълнение на рекурсивна заявка