簡體   English   中英

Oracle SQL 中時間戳轉換為EPOCH時間

[英]Timestamp conversion to EPOCH time in Oracle SQL

我將日期作為表“22/03/2022 06:59:59”中的一列輸入

我需要轉換成 EPOCH 時間-預期輸出-“1647932399”時區(印度尼西亞雅加達)

參考鏈接- https://www.epochconverter.com/

輸入數據的時區是 - UTC +7:00(Jakarta)

試過這個- SQL CODE

SELECT (CAST(SYS_EXTRACT_UTC(to_timestamp('22/03/2022 06:59:59','dd/mm/yyyy HH:MI:SS' )) AS DATE) - TO_DATE('01/01/1970','DD/MM/YYYY')) * 24 * 60 * 60 FROM DUAL;

結果顯示為1647907199

但沒有得到預期的 output

1647932399 是 2022-03-22 06:59:59 UTC 的紀元。 您的開始時間是 22-03-22 06:59:59 Asia/Jakarta,也就是 22-03-21 23:59:59 UTC,而那個紀元是 1647907199 - 這就是您得到的。 所以你的結果是正確的; 但有風險。

您依賴於隱式轉換。 to_timestamp('22/03/2022 06:59:59','dd/mm/yyyy HH:MI:SS')給你一個簡單的時間戳,沒有時區信息。 當您執行SYS_EXTRACT_UTC(...)時,普通時間戳將使用您的 session 時區隱式轉換為帶時區的時間戳 - 看起來恰好是雅加達。 所以它有效 - 對你來說,在這個 session 中。如果你更改你的 session 時區,或者更有可能如果其他人從具有不同時區的 session 運行相同的代碼,那么結果將不同。

更明確地說,您可以將字符串轉換為純時間戳,然后聲明它代表雅加達時間,然后將其轉換為 UTC:

sys_extract_utc(from_tz(to_timestamp('22/03/2022 06:59:59', 'DD/MM/YYYY HH24:MI:SS'), 'Asia/Jakarta'))

21-MAR-22 23.59.59.000000000 UTC

基本上有兩種方法可以將其轉換為紀元號; 要么將其轉換為日期,減去 1970-01-01 作為日期,然后操作結果天數(如您的問題):

select
  round(
    (
      cast(
        sys_extract_utc(from_tz(to_timestamp('22/03/2022 06:59:59', 'DD/MM/YYYY HH24:MI:SS'), 'Asia/Jakarta'))
          as date)
        - date '1970-01-01'
     ) * 24 * 60 * 60
  ) as result
from dual;

1647907199

或者保留它作為時間戳,減去 1970-01-01 作為時間戳,然后操作結果間隔:

select
  (extract(day from diff) * 24 * 60 * 60)
  + (extract(hour from diff) * 60 * 60)
  + (extract(minute from diff) * 60)
  + extract(second from diff)
  as result
from (
  select sys_extract_utc(from_tz(to_timestamp('22/03/2022 06:59:59', 'DD/MM/YYYY HH24:MI:SS'), 'Asia/Jakarta'))
    - timestamp '1970-01-01 00:00:00' as diff
  from dual
);

1647907199

請注意,無論哪種方式,您都可以通過截斷數字或僅提取天數,而無需明確減去 23:59:59 部分,從而輕松獲得作為上一個問題基礎的簡短結果。 要么給你 19072。

數據庫<>小提琴

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM