我有一个以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
时区不正确。
TZD值是带有夏令时信息的缩写时区字符串。它必须与TZR中指定的区域相对应。
这是否意味着abbreviated time zone string
应该Time zone region
执行正确的转换?但是,Time zone region
将会成功
abbreviated time zone string
多余。不是吗?
我该如何处理?
答案 0 :(得分:2)
实际上,您的查询应该引发错误ORA-01857: not a valid time zone
或ORA-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
您必须使用PST
作为时区区域。然后从给定日期确定夏令时设置:
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
由于您的值存储为VARCHAR2
(现在您知道为什么不应该这样做),您可以使用REGEXP_REPLACE(dt_string, 'PDT', 'PST')