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

时间:2015-04-07 05:26:57

标签: sql oracle timezone

我有一个以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多余。不是吗?

我该如何处理?

1 个答案:

答案 0 :(得分: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

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

更改它