【问题标题】:Issue with parsing time string timezone to timestamp in oracle在 oracle 中将时间字符串时区解析为时间戳的问题
【发布时间】:2019-06-28 10:28:40
【问题描述】:

我有一个日期字符串,如Mon Jun 24 23:42:36 EDT 2019,我想在我的 oracle sql 查询中从中获取时间戳。为此,我正在尝试以下查询

select TO_TIMESTAMP_TZ ('Mon Jun 24 23:42:36 EDT 2019', 'Dy Mon DD HH24:MI:SS TZR YYYY')  as "Creation Time"
from dual;

这给了我“未找到时区”的错误。我也尝试使用 TZD 进行时区解析,但它没有帮助。

将给定字符串解析为时间戳的正确日期格式是什么?

【问题讨论】:

    标签: oracle timestamp


    【解决方案1】:

    时区EDT 不是有效时区。使用此查询检查有效的时区名称:

    SELECT tzname, tzabbrev, TZ_OFFSET(tzname)
    FROM V$TIMEZONE_NAMES 
    WHERE tzabbrev = 'EDT' OR tzname = 'EDT';
    
    
    +-------------------------------------------------------+
    |TZNAME                      |TZABBREV|TZ_OFFSET(TZNAME)|
    +-------------------------------------------------------+
    |America/Detroit             |EDT     |-04:00           |
    |America/Fort_Wayne          |EDT     |-04:00           |
    |America/Grand_Turk          |EDT     |-04:00           |
    |America/Indiana/Indianapolis|EDT     |-04:00           |
    |America/Indiana/Marengo     |EDT     |-04:00           |
    |America/Indiana/Petersburg  |EDT     |-04:00           |
    |America/Indiana/Vevay       |EDT     |-04:00           |
    |America/Indiana/Vincennes   |EDT     |-04:00           |
    |America/Indiana/Winamac     |EDT     |-04:00           |
    |America/Indianapolis        |EDT     |-04:00           |
    |America/Iqaluit             |EDT     |-04:00           |
    |America/Kentucky/Louisville |EDT     |-04:00           |
    |America/Kentucky/Monticello |EDT     |-04:00           |
    |America/Louisville          |EDT     |-04:00           |
    |America/Montreal            |EDT     |-04:00           |
    |America/Nassau              |EDT     |-04:00           |
    |America/New_York            |EDT     |-04:00           |
    |America/Nipigon             |EDT     |-04:00           |
    |America/Pangnirtung         |EDT     |-04:00           |
    |America/Santo_Domingo       |EDT     |-04:00           |
    |America/Thunder_Bay         |EDT     |-04:00           |
    |America/Toronto             |EDT     |-04:00           |
    |Canada/Eastern              |EDT     |-04:00           |
    |EST5EDT                     |EDT     |-04:00           |
    |US/East-Indiana             |EDT     |-04:00           |
    |US/Eastern                  |EDT     |-04:00           |
    |US/Michigan                 |EDT     |-04:00           |
    |America/Cancun              |EDT     |-05:00           |
    |America/Indiana/Tell_City   |EDT     |-05:00           |
    |America/Jamaica             |EDT     |-05:00           |
    |America/Port-au-Prince      |EDT     |-05:00           |
    |Jamaica                     |EDT     |-05:00           |
    +-------------------------------------------------------+
    

    例如这个正在工作:

    select 
       TO_TIMESTAMP_TZ ('Mon Jun 24 23:42:36 America/New_York 2019', 'Dy Mon DD HH24:MI:SS TZR YYYY')  as "Creation Time"
    from dual;
    

    TZD 格式用于确定夏令时,例如2019-11-03 01:40:00 不明确,请参阅

    ALTER SESSION SET ERROR_ON_OVERLAP_TIME = TRUE; -- default is FALSE
    
    SELECT 
       TO_TIMESTAMP_TZ ('Sun Nov 03 01:42:36 America/New_York 2019', 'Dy Mon DD HH24:MI:SS TZR YYYY')  AS "Creation Time"
    FROM dual;
    
    Error at line 2
    ORA-01883: overlap was disabled during a region transition
    
    
    SELECT 
       TO_TIMESTAMP_TZ ('Sun Nov 03 01:42:36 America/New_York EST 2019', 'Dy Mon DD HH24:MI:SS TZR TZD YYYY')  AS "Creation Time A",
       TO_TIMESTAMP_TZ ('Sun Nov 03 01:42:36 America/New_York EDT 2019', 'Dy Mon DD HH24:MI:SS TZR TZD YYYY')  AS "Creation Time B"
    FROM dual;
    
    +-------------------------------------------------------------------------+
    |Creation Time A                     |Creation Time B                     |
    +-------------------------------------------------------------------------+
    |03.11.2019 01:42:36.000000000 -05:00|03.11.2019 01:42:36.000000000 -04:00|
    +-------------------------------------------------------------------------+
    

    【讨论】:

    • 不,EDT 是模棱两可的。您可以使用一些例外情况,请查看SELECT tzname, tzabbrev FROM V$TIMEZONE_NAMES WHERE tzname = tzabbrev;
    猜你喜欢
    • 2015-04-02
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    相关资源
    最近更新 更多