我以前曾使用Oracle時區的時間戳,但是這次我將值作爲字符串獲取並嘗試將它們加載到數據庫。爲什麼Oracle的to_timestamp_tz返回錯誤的時間和/或時區?
轉換字符串時,我最終在數據庫時區中有一個值。這很奇怪,但如果它相應地調整了時間,它卻沒有可行性。請看下圖:
SELECT TO_CHAR(systimestamp AT TIME ZONE 'Canada/Pacific',
'HH24:MI:SS Mon DD, YYYY TZD') now_pst
, TO_CHAR(systimestamp AT TIME ZONE 'Canada/Eastern',
'HH24:MI:SS Mon DD, YYYY TZD') now_est
FROM DUAL
導致:
now_pst now_est
09:55:50 Dec 19, 2016 PST 12:55:50 Dec 19, 2016 EST
現在使用TO_TIMESTAMP_TZ:
SELECT '09:55:50 Dec 19, 2016 PST' now_pst
, TO_TIMESTAMP_TZ('09:55:50 Dec 19, 2016 PST', 'HH24:MI:SS Mon DD, YYYY TZD') now_pst_tz
, '12:55:50 Dec 19, 2016 EST' now_est
, TO_TIMESTAMP_TZ('12:55:50 Dec 19, 2016 EST', 'HH24:MI:SS Mon DD, YYYY TZD') now_est_tz
FROM dual
結果:
now_pst now_pst_tz now_est now_est_tz
09:55:50 Dec 19, 2016 PST 19.12.2016 09:55:50.000 -05:00 12:55:50 Dec 19, 2016 EST 19.12.2016 12:55:50.000 -05:00
,我應該得到的是: NOW_PST_TZ = 2016年12月19日09:55:50.000 -08:00 (未-05:00)
NOW_EST_TZ = 2016年12月19日12:55:50.000 -05:00
我有很多的期望這不是在這裏發生的,但主要是這些應該是同一時間 - 一個在加拿大/東部和一個在加拿大/太平洋。然而我得到2個不同的時間。
to_timestamp_tz無法將字符串轉換爲正確的TZD。
的要求:
select sessiontimezone, dbtimezone from dual
結果:
SESSIONTIMEZONE DBTIMEZONE
-05:00 +00:00
你可以運行這個查詢:'從雙重選擇sessiontimezone,dbtimezone;'並將其結果附加到問題? – krokodilko
@krokodilko,你期待什麼值'dbtimezone'? –
@Wernfried Domscheit'systimestamp'函數返回數據庫所在系統的系統日期,*系統時區*。 'dbtimezone'函數返回這個時區(系統時區)。 'sessiontimezone'返回會話的時區。它們可以是不同的(dbtimezone&sessiontimezone)。 – krokodilko