将带缩写时区的字符串转换为时间戳

Conversion of String with Abbreviated Timezone to Timestamp

我有一个以 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 说,

The TZD value is an abbreviated time zone string with daylight saving information. It must correspond with the region specified in TZR.

这是否意味着 abbreviated time zone string 应该 Time zone region 才能执行正确的转换?但是,拥有 Time zone region 将使 abbreviated time zone string 多余。不是吗?

我该如何处理?

实际上您的查询应该引发错误 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

您必须使用 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')

更改它