Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Chuyển đổi ngày giờ cục bộ (với múi giờ) thành dấu thời gian Unix trong Oracle

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

db <> fiddle

Đ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

db <> fiddle

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 .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PL / SQL ĐỂ LOOP IMPLICIT CURSOR

  2. Các thực thể kiểu biến bảng trong Oracle

  3. Cách thiết lập Thư mục đích đến của bản ghi lưu trữ trong cơ sở dữ liệu Oracle

  4. cấp để tạo từ đồng nghĩa trên một lược đồ khác (Oracle)

  5. Truyền được chỉ định không hợp lệ khi điền DataTable từ OracleDataAdapter.Fill ()