Oracle PL / SQL получить текущую метку времени № 19 - PullRequest
1 голос
/ 20 февраля 2020

Есть ли в Oralce PL / SQL способ получить текущую временную метку в виде НОМЕРА?

Что-то вроде '1582185277302'

Ответы [ 3 ]

1 голос
/ 20 февраля 2020

Unix отметки времени находятся в часовом поясе UT C. Если ваша временная метка находится в часовом поясе UT C, то вы можете использовать:

( TRUNC( your_timestamp, 'MI' ) - DATE '1970-01-01' ) * 24 * 60 * 60 * 1000
+ EXTRACT( SECOND FROM your_timestamp ) * 1000

Если ваши временные метки имеют часовой пояс, то:

( TRUNC( your_timestamp AT TIME ZONE 'UTC', 'MI' ) - DATE '1970-01-01' ) * 24 * 60 * 60 * 1000
+ EXTRACT( SECOND FROM your_timestamp ) * 1000

Если вам нужно обработать скачок секунд вы можете использовать этот ответ .

1 голос
/ 20 февраля 2020

Вы можете преобразовать текущую дату / время в метку времени эпохи следующим образом:

 (sysdate - date '1970-01-01') * 60 * 60 * 24

Это количество секунд с 1 января 1970 года.

Если вы хотите результаты в миллисекундах, затем:

(cast(systimestamp as date) - date '1970-01-01') * 24 * 60 * 60 * 1000 
+ mod( extract(second from systimestamp), 1) * 1000 
0 голосов
/ 20 февраля 2020

Если вы вычтете фиксированную временную метку из systimestamp, вы получите интервал:

select systimestamp - timestamp '1970-01-01 00:00:00 UTC' as diff
from dual;

DIFF                  
----------------------
+18312 10:05:29.674905

Затем вы можете извлечь и манипулировать элементами этого, чтобы получить время эпохи, используя встроенное представление или CTE для избегайте повторения генерации интервала:

with t (diff) as (
  select systimestamp - timestamp '1970-01-01 00:00:00 UTC'
  from dual
)
select trunc(1000 * (
    extract (day from diff) * 24 * 60 *60
      + extract (hour from diff) * 60 * 60
      + extract (minute from diff) * 60
      + extract (second from diff)
  )) as epoch
from t;

              EPOCH
-------------------
      1582193129829

Добавление всех экстрактов вместе дает вам общее количество секунд, включая дроби; умножение на 1000 дает вам миллисекунды, но все равно будет иметь дроби (в зависимости от точности, поддерживаемой вашей платформой); усечение, дающее вам только миллисекунды.

Это учитывает часовой пояс (время эпохи должно считаться от UT C); но не позволяет високосные секунды.

В качестве еще одной демонстрации, используя фиксированное время в произвольном часовом поясе, чтобы получить результат в вашем вопросе:

with t (diff) as (
  select timestamp '2020-02-20 02:54:37.302789 America/New_York' - timestamp '1970-01-01 00:00:00 UTC'
  from dual
)
select trunc(1000 * (
    extract (day from diff) * 24 * 60 *60
      + extract (hour from diff) * 60 * 60
      + extract (minute from diff) * 60
      + extract (second from diff)
  )) as epoch
from t;

              EPOCH
-------------------
      1582185277302
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...