我有一个以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
冗余。不是吗?
我该如何处理?
实际上,您的查询应该会引发错误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')
来更改它