2015-04-07 84 views
1

我有一個時間戳存儲爲May 29 14:12:56 PDT 2015格式的varchar2。我想將其轉換爲timestamp with time zone數據類型。字符串與縮寫時區轉換爲時間戳

如果我使用,

with x(dt_string) as (
    select 'May 29 14:12:56 PDT 2015' from dual 
) 
select dt_string, 
to_timestamp_tz(dt_string,'Mon dd hh24:mi:ss TZD YYYY') dt_ts 
from x; 

它給了我,

DT_STRING     DT_TS 
------------------------ ---------------------------------------- 
May 29 14:12:56 PDT 2015 29-MAY-15 02.12.56.000000000 PM +00:00 

時區不正確。

Documentation說,

的TZD值是一個縮寫時區串夏令信息。它必須與TZR中指定的區域一致。

這是否意味着abbreviated time zone string應該有Time zone region來執行正確的轉換?但是,有Time zone region會使 abbreviated time zone string多餘。不是嗎?

我該如何處理?

回答

2

其實你的查詢應提高誤差ORA-01857: not a valid time zoneORA-01882: timezone region not found

PDT是不是一個有效的時區區域,即它是不明確的。運行此查詢獲得的PDT不同的含義:

SELECT tzabbrev, TZ_OFFSET(tzname), tzname 
FROM v$timezone_names 
WHERE tzabbrev = 'PDT' 
ORDER BY 2; 

TZABBREV TZ_OFFSET(TZNAME) TZNAME 
PDT -06:00 America/Inuvik 
PDT -07:00 US/Pacific-New 
PDT -07:00 America/Ensenada 
PDT -07:00 America/Dawson 
PDT -07:00 America/Dawson_Creek 
PDT -07:00 America/Los_Angeles 
PDT -07:00 America/Tijuana 
PDT -07:00 America/Vancouver 
PDT -07:00 America/Whitehorse 
PDT -07:00 Canada/Pacific 
PDT -07:00 Canada/Yukon 
PDT -07:00 Mexico/BajaNorte 
PDT -07:00 PST 
PDT -07:00 PST8PDT 
PDT -07:00 US/Pacific 
PDT -08:00 America/Juneau 

你必須使用作爲的時間區域。夏令設置,然後從某一天決定:

SELECT 
    TO_TIMESTAMP_TZ('Jan 29 14:12:56 PST 2015','Mon dd hh24:mi:ss TZR YYYY') dt_ts_winter, 
    TO_TIMESTAMP_TZ('Jun 29 14:12:56 PST 2015','Mon dd hh24:mi:ss TZR YYYY') dt_ts_summer 
FROM dual; 

DT_TS_WINTER       DT_TS_SUMMER 
2015-01-29 14:12:56.000000000 -08:00 2015-06-29 14:12:56.000000000 -07:00 

因爲你可以用REGEXP_REPLACE(dt_string, 'PDT', 'PST')

改變它的值存儲爲 VARCHAR2(現在你知道爲什麼你不應該做這樣的)