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



我有一个以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 regionabbreviated 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') 来更改它

相关内容

  • 没有找到相关文章

最新更新