2022 年 3 月 27 日 02:00,在 01:00 時區,時鐘提前一小時。所以我希望根據以下代碼,v_date_diff 將是 00000 03:00:00。然而它是: 00000 04:00:00。
v_start_date TIMESTAMP WITH TIME ZONE := TO_TIMESTAMP_TZ ('27/03/2022 00:59:59 1:00', 'DD/MM/YYYY HH24:MI:SS TZH:TZM');
v_end_date TIMESTAMP WITH TIME ZONE := TO_TIMESTAMP_TZ ('27/03/2022 04:59:59 1:00', 'DD/MM/YYYY HH24:MI:SS TZH:TZM');
v_date_diff INTERVAL DAY(5) TO SECOND(0) := v_end_date - v_start_date;
為什么是這樣?我應該如何解決這個問題?
uj5u.com熱心網友回復:
UTC 不遵循夏令時,因此與夏令時的任何固定偏移都不會遵循夏令時。所以 Oracle 是正確的,您的時間戳之間有 4 個小時。
如果您使用實際遵守夏令時的時區指定時間戳,您將獲得所需的 3 小時的結果。例如,時區“歐洲/柏林”遵守 DST,因此以下代碼回傳 3 小時的差異
declare
v_start_date TIMESTAMP WITH TIME ZONE := TO_TIMESTAMP_TZ ('27/03/2022 00:59:59 Europe/Berlin',
'DD/MM/YYYY HH24:MI:SS TZR');
v_end_date TIMESTAMP WITH TIME ZONE := TO_TIMESTAMP_TZ ('27/03/2022 04:59:59 Europe/Berlin',
'DD/MM/YYYY HH24:MI:SS TZR');
v_date_diff INTERVAL DAY(5) TO SECOND(0) := v_end_date - v_start_date;
begin
dbms_output.put_line( v_date_diff );
end;
uj5u.com熱心網友回復:
Oracle 資料庫以 UTC 時間執行所有時間戳算術。 1:00表示 UTC 前 1 小時 -始終,即它不適用任何夏令時。以阿爾及利亞為例,它也有時區 1:00,但不使用夏令時。
當您說“ 2022 年 3 月 27 日 02:00,在 01:00 時區,時鐘向前移動一小時。 ”那么您的資料是錯誤的。在這種情況下,它必須是(使用 TIMESTAMP 文字)
v_end_date TIMESTAMP WITH TIME ZONE := TIMESTAMP '2022-03-27 04:59:59 2:00';
那么差異將是3小時。Europe/Berlin或者按照 Justin Cave 的建議使用時區名稱(例如)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/432935.html
上一篇:如何比較計數的元素?
下一篇:如何加入具有不同欄位ID的列?
