【问题标题】:Convert String ISO-8601 date to oracle's timestamp datatype将 String ISO-8601 日期转换为 oracle 的时间戳数据类型
【发布时间】:2020-11-20 01:01:35
【问题描述】:

我有一个 VARCHAR2 类型的 ISO-8601 日期,如何将该字符串日期转换为 oracle db 中的时间戳?

日期示例:“2014-09-12T11:53:06+00:00”

可能类似于以下内容,但我不确定格式是什么。

SELECT to_timestamp_tz ('2014-09-12T11:53:06+00:00', ????) FROM DUAL

【问题讨论】:

    标签: database oracle iso8601


    【解决方案1】:

    日期格式模型元素列在Datetime Format Models documentation:

    SELECT to_timestamp_tz ('2014-09-12T11:53:06+00:00', 'YYYY-MM-DD"T"HH24:MI:SSTZH:TZM')
    FROM DUAL
    
    TO_TIMESTAMP_TZ('2014-09-12T11:53:06+00:00','YYYY-MM-DD"T"HH24:MI:SSTZH:TZM')
    ---------------------------------------------------------------------------
    12-SEP-14 11.53.06.000000000 +00:00
    

    固定的T 可以作为字符文字包含:

    您可以在日期格式模型中包含这些字符:

    • 连字符、斜杠、逗号、句号和冒号等标点符号
    • 字符文字,用双引号括起来

    TZH 是时区小时,TZM 是时区分钟。其余的是更常见的模型元素。

    【讨论】:

      【解决方案2】:

      我有一个应用程序正在对 OracleDB 数据库 (19c) 进行查询。 该应用正在发送 ISO 8601 格式的时间戳参数,并且该表有一个属于 Oracle TIMESTAMP 类型(不是 Oracle TIMESTAMP WITH TIMEZONE 类型)的列,该列用于存储表示 UTC 时间的时间戳。

      我认为以下查询会起作用,但它似乎无法识别用双引号括起来的文字:

      SELECT * FROM measurements
      WHERE measID = '333'
      AND measTime > to_timestamp('2020-11-19T05:00:00Z', 'YYYY-MM-DD"T"hh:mm:ss"Z"');
      -- Doesn't Work
      -- ORA-01810: format code appears twice
      -- 01810. 00000 -  "format code appears twice"
      

      以下对我有用:

      SELECT * FROM measurements
      WHERE measID = '333'
      AND measTime > SYS_EXTRACT_UTC(TO_UTC_TIMESTAMP_TZ('2020-11-19T05:00:00Z'));
      -- Works
      

      共享,因为在 Oracle 文档中并未立即明确将 ISO 8601 格式化为 TIMESTAMP 类型。 我在这里找到了这个解决方案: https://oracle-base.com/articles/18c/to_utc_timestamp_tz-function-18c

      【讨论】:

      • 你打错了 ...YYYY-MM-DD"T"hh:mm:ss"Z"... 应该是 ...YYYY-MM-DD"T"hh:mi :ss"Z"... 注意 mm -> mi 表示分钟。
      猜你喜欢
      • 2021-11-19
      • 2020-11-23
      • 2022-10-15
      • 1970-01-01
      • 2012-02-13
      • 1970-01-01
      • 2011-04-16
      • 2013-01-30
      • 1970-01-01
      相关资源
      最近更新 更多