将字符串ISO-8601日期转换为oracle的timestamp数据类型

时间:2014-10-31 09:43:35

标签: database oracle iso8601

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

日期示例:" 2014-09-12T11:53:06 + 00:00和#34;

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

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

2 个答案:

答案 0 :(得分:15)

日期格式模型元素为listed in the 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是时区分钟。其余的是更常见的模型元素。

答案 1 :(得分:1)

我有一个应用程序正在对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