【问题标题】:Conversion of String with Abbreviated Timezone to Timestamp将带有缩写时区的字符串转换为时间戳
【发布时间】:2015-06-11 14:58:56
【问题描述】:

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

我该如何处理?

【问题讨论】:

    标签: sql oracle timezone


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-30
      • 1970-01-01
      • 1970-01-01
      • 2018-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-22
      相关资源
      最近更新 更多