嘗試將日期時間轉換為紀元時,出現錯誤:ORA-01810:格式代碼出現兩次
QracleSQL 查詢:
select (trunc(TO_TIMESTAMP('2022-05-08T19:09:17Z', 'yyyy-MM-dd"T"HH:mm:ssXXX')) - TO_DATE('01/01/1970', 'MM/DD/YYYY')) * 24 * 60 * 60 from dual;
uj5u.com熱心網友回復:
你應該使用:
TO_TIMESTAMP_TZ代替TO_TIMESTAMP- 格式模型
YYYY-MM-DD"T"HH24:MI:SS.FF TZD而不是錯誤地使用MM兩次,HH24而不是HH,.FF而不是XXX,而TZD不是硬編碼"Z"。 - 確保您始終將時間戳轉換為 UTC 時區(您的已經是但其他人可能不是)
- 不要在午夜
TRUNC吃時間戳,否則您將丟失時間部分。DATE
像這樣:
SELECT ROUND(
(
TRUNC(timestamp_value AT TIME ZONE 'UTC', 'MI')
- DATE '1970-01-01'
) * 86400
EXTRACT(SECOND FROM timestamp_value AT TIME ZONE 'UTC')
) AS epoch_time
FROM (
SELECT TO_TIMESTAMP_TZ(
'2022-05-08T19:09:17Z',
'YYYY-MM-DD"T"HH24:MI:SS.FF TZD'
) AS timestamp_value
FROM DUAL
);
哪個輸出:
EPOCH_TIME 1652033357
db<>在這里擺弄
uj5u.com熱心網友回復:
像這樣的東西:
測驗資料
create table sample_inputs (ts_string) as
select '2022-05-08T16:49:34Z' from dual union all
select '2022-04-15T04:20:13.525Z' from dual
;
查詢和輸出
with
prep (ts_string, ts) as (
select ts_string,
to_timestamp(ts_string, 'yyyy-mm-dd"T"hh24:mi:ss.ff"Z"')
from sample_inputs
)
select ts_string,
round((trunc(ts, 'mi') - date '1970-01-01') * 24 * 3600)
extract(second from ts)
as epoch
from prep;
TS_STRING EPOCH
-------------------------- -----------
2022-05-08T16:49:34Z 1652028574
2022-04-15T04:20:13.525Z 1649996413.525
筆記
在你的嘗試中有幾個錯誤。Oracle 小數秒元素是ff,而不是xxx。您最后缺少硬編碼 Z 的占位符(您的掩碼中有“T”,這是正確的,但您缺少類似的“Z”)。HH是不夠的 - 它必須是HH24或HH后面AM(或等效PM)在最后。在您的示例中,顯然是HH24. 并且在 OracleMM中mm意味著同樣的事情——這不是 Unix。分鐘的元素是mi或等價MI的。
我寫的查詢保留了紀元中的小數秒。今天早些時候的另一個問題(也許你也是,在另一個用戶名下)被關閉為“重復” - 但是當輸入是 Oracle 時間戳與 Oracle 日期(其中總是有時間分量,但只有整秒)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/472557.html
