2015-04-07 87 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(现在你知道为什么你不应该做这样的)