Если вы вычтете фиксированную временную метку из 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