2016-12-19 18 views
0

我以前曾使用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 
+0

你可以運行這個查詢:'從雙重選擇sessiontimezone,dbtimezone;'並將其結果附加到問題? – krokodilko

+0

@krokodilko,你期待什麼值'dbtimezone'? –

+0

@Wernfried Domscheit'systimestamp'函數返回數據庫所在系統的系統日期,*系統時區*。 'dbtimezone'函數返回這個時區(系統時區)。 'sessiontimezone'返回會話的時區。它們可以是不同的(dbtimezone&sessiontimezone)。 – krokodilko

回答

0

更改格式模型從YYYY TZDYYYY TZR TZD最後一部分 - 你缺少格式模型TZR

SQL> SELECT '09:55:50 Dec 19, 2016 PST' now_pst 
    2 , TO_TIMESTAMP_TZ('09:55:50 Dec 19, 2016 PST', 'HH24:MI:SS Mon DD, YYYY TZR TZD') now_pst_tz 
    3 , '12:55:50 Dec 19, 2016 EST' now_est 
    4 , TO_TIMESTAMP_TZ('12:55:50 Dec 19, 2016 EST', 'HH24:MI:SS Mon DD, YYYY TZR TZD') now_est_tz 
    5 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 -08:00 
12:55:50 Dec 19, 2016 EST 19.12.2016 12:55:50.000 -05:00 


1 row selected. 

編輯:此外,由於Wernfried顯示了他的答案,最好是在輸入字符串使用Canada/Pacific而非和Canada/Eastern而非EST

+0

有趣... TZR給出ORA -01882時區的未找到的區域%s,但在PLSQL中有效。這可能夠了。 –

+0

btw數據來自貝寶,我無法控制它。在社會中,這種格式的日期/時間是很好理解的。不過,我可能已經把自己鎖在沙箱中,只是想着北美。也許我需要同行邊緣大聲笑 我發現的小文檔似乎支持TZD格式,而不是TZR TZD。但是,格式掩碼並不多。 我會看看我能否在未來幾天證明這一點。感謝您及時的回覆 :) –

0

TZD表示夏令時信息。 TZD值是具有夏令時信息的縮寫時區字符串。它必須與TZR中指定的區域一致。

沒有時區的區域內,使用TZD是模糊的,請與該查詢:

SELECT tzabbrev, tzname, TZ_OFFSET(tzname) 
FROM V$TIMEZONE_NAMES 
WHERE tzabbrev in ('PST', 'EST'); 

TZABBREV TZNAME TZ_OFFSET(TZNAME) 
EST America/Antigua -04:00 
EST America/Atikokan -05:00 
EST America/Cambridge_Bay -07:00 
EST America/Cancun -06:00 
EST America/Cayman -05:00 
EST America/Chicago -06:00 
EST America/Coral_Harbour -05:00 
EST America/Detroit -05:00 
EST America/Fort_Wayne -05:00 
EST America/Grand_Turk -05:00 
EST America/Indiana/Indianapolis -05:00 
EST America/Indiana/Knox -06:00 
EST America/Indiana/Marengo -05:00 
EST America/Indiana/Petersburg -05:00 
EST America/Indiana/Tell_City -06:00 
EST America/Indiana/Vevay -05:00 
EST America/Indiana/Vincennes -05:00 
EST America/Indiana/Winamac -05:00 
EST America/Indianapolis -05:00 
EST America/Iqaluit -05:00 
EST America/Jamaica -05:00 
EST America/Kentucky/Louisville -05:00 
EST America/Kentucky/Monticello -05:00 
EST America/Knox_IN -06:00 
EST America/Louisville -05:00 
EST America/Managua -06:00 
EST America/Menominee -06:00 
EST America/Merida -06:00 
EST America/Moncton -04:00 
EST America/Montreal -05:00 
EST America/Nassau -05:00 
EST America/New_York -05:00 
EST America/Nipigon -05:00 
EST America/Panama -05:00 
EST America/Pangnirtung -05:00 
EST America/Port-au-Prince -05:00 
EST America/Rankin_Inlet -06:00 
EST America/Resolute -06:00 
EST America/Santo_Domingo -04:00 
EST America/Thunder_Bay -05:00 
EST America/Toronto -05:00 
EST Antarctica/Macquarie +11:00 
EST Australia/ACT +11:00 
EST Australia/Brisbane +10:00 
EST Australia/Broken_Hill +10:30 
EST Australia/Canberra +11:00 
EST Australia/Currie +11:00 
EST Australia/Hobart +11:00 
EST Australia/LHI +11:00 
EST Australia/Lindeman +10:00 
EST Australia/Lord_Howe +11:00 
EST Australia/Melbourne +11:00 
EST Australia/NSW +11:00 
EST Australia/Queensland +10:00 
EST Australia/Sydney +11:00 
EST Australia/Tasmania +11:00 
EST Australia/Victoria +11:00 
EST Australia/Yancowinna +10:30 
EST CST -06:00 
EST Canada/Eastern -05:00 
EST EST -05:00 
EST EST5EDT -05:00 
EST Jamaica -05:00 
EST US/Central -06:00 
EST US/East-Indiana -05:00 
EST US/Eastern -05:00 
EST US/Indiana-Starke -06:00 
EST US/Michigan -05:00 
PST America/Bahia_Banderas -06:00 
PST America/Boise -07:00 
PST America/Creston -07:00 
PST America/Dawson -08:00 
PST America/Dawson_Creek -07:00 
PST America/Ensenada -08:00 
PST America/Hermosillo -07:00 
PST America/Inuvik -07:00 
PST America/Juneau -09:00 
PST America/Los_Angeles -08:00 
PST America/Mazatlan -07:00 
PST America/Metlakatla -08:00 
PST America/Santa_Isabel -08:00 
PST America/Sitka -09:00 
PST America/Tijuana -08:00 
PST America/Vancouver -08:00 
PST America/Whitehorse -08:00 
PST Canada/Pacific -08:00 
PST Canada/Yukon -08:00 
PST Mexico/BajaNorte -08:00 
PST Mexico/BajaSur -07:00 
PST PST -08:00 
PST PST8PDT -08:00 
PST Pacific/Pitcairn -08:00 
PST US/Pacific -08:00 
PST US/Pacific-New -08:00 

當您使用​​那麼你應該使用TZR全區域名稱。

您的表情TO_TIMESTAMP_TZ('09:55:50 Dec 19, 2016 PST', 'HH24:MI:SS Mon DD, YYYY TZD')相當於TO_TIMESTAMP_TZ('09:55:50 Dec 19, 2016 '||SESSIONTIMEZONE||' PST', 'HH24:MI:SS Mon DD, YYYY TZR TZD')。如果您當前的會話時區縮寫不在/EST中,則會失敗。

相關問題