Bạn có thể chuyển đổi dấu thời gian của mình với múi giờ thành UTC, sau đó trừ đi kỷ nguyên đó:
select timestamp '2018-10-19 09:12:47.0 AMERICA/DENVER'
- timestamp '1970-01-01 00:00:00.0 UTC' as diff
from dual;
cung cấp cho bạn một kiểu dữ liệu khoảng thời gian:
DIFF
----------------------
+17823 15:12:47.000000
Sau đó, bạn có thể trích xuất các phần tử từ đó và nhân mỗi phần tử với một hệ số thích hợp để chuyển đổi nó thành mili giây (tức là cho ngày, 60 * 60 * 24 * 1000); và sau đó thêm chúng lại với nhau:
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
Điều này cũng bảo toàn mili giây, nếu dấu thời gian bắt đầu có chúng (dấu thời gian này chuyển đổi từ thời gian 'Unix' trong khi giữ nguyên chúng):
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
sau đó để chuyển đổi trở lại:
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
Nếu dấu thời gian bắt đầu của bạn có độ chính xác cao hơn mức đó thì bạn sẽ cần phải cắt bớt (hoặc vòng / sàn / ceil / ép kiểu) để tránh có kết quả không phải là số nguyên; phiên bản này chỉ cắt bớt phần mili giây được trích xuất:
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
Nếu không có phần cắt ngắn đó (hoặc tương đương), bạn sẽ kết thúc bằng 1539961967123.456789
.
Tôi đã quên mất sự khác biệt về giây nhuận; nếu bạn cần / muốn xử lý điều đó, hãy xem câu trả lời này .