我在表格“22/03/2022 06:59:59”中輸入日期作為列
我需要轉換為 EPOCH 時間 - 預期輸出 - “1647932399”時區(印度尼西亞雅加達)
參考鏈接 - https://www.epochconverter.com/
輸入資料的時區是 - UTC 7:00(雅加達)
試過這個 - 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
但沒有得到預期的輸出
uj5u.com熱心網友回復:
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(...)使用會話時區將普通時間戳隱式轉換為帶有時區的時間戳時 - 似乎恰好是雅加達。所以它對你有用,在這個會話中。如果您更改會話時區,或者更有可能其他人從具有不同時區的會話中運行相同的代碼,那么結果將會不同。
更明確地說,您可以將字串轉換為純時間戳,然后宣告它代表雅加達時間,然后將其轉換為 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。
db<>小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/467503.html
標籤:sql 甲骨文 oracle-sqldeveloper
