如何将“1985-02-07T00:00:00.000Z”(ISO8601格式)转换为Oracle中的日期值?

39

我试图将一个时间戳("1985-02-07T00:00:00.000Z")转换为日期,但在多次尝试中都没有成功。

以下是我尝试过的查询:

 select to_date('1985-02-07T00:00:00.000Z', 'YYYY-MM-DDTHH24:MI:SS.fffZ')
 from dual;

非常感谢您的建议。


3
尝试新事物是值得肯定的。你可以通过说明结果及其错误之处,或者通常不起作用的方面来改进问题。 (是否出现错误?日期是否偏移几小时?) - user166390
2
根据to_date的说明,我认为至少"fff"是错误的,应该是"FF3"。但是我没有使用/拥有Oracle :) - user166390
5个回答

58

to_date 函数将输入转换为不支持分数秒的 DATE 类型。如需使用分数秒,需要使用 TIMESTAMP 类型,请使用 to_timestamp

pst 对于 ff3 修饰符的评论也是正确的。

格式掩码中的“常量”值需要用双引号括起来。

因此最终语句为:

select to_timestamp('1985-02-07T00:00:00.000Z', 'YYYY-MM-DD"T"HH24:MI:SS.ff3"Z"')
from dual;

11
SQL> select cast(to_timestamp('1985-02-07T00:00:00.000Z', 'yyyy-mm-dd"T"hh24:mi:ss.ff3"Z"') as date)
  2    from dual
  3  /

CAST(TO_TIMESTAMP('
-------------------
07-02-1985 00:00:00

1 row selected.

5

遵循一些规则

  1. 字面量必须用双引号括起来:MM 表示月份,"MM" 表示双 M。
  2. 小数秒的格式为 FF,而不是 FFFF。您可以使用带有整数后缀的数字指定位数,例如 FF3
  3. 但是日期无法保留小数秒,因此在此上下文中不能使用 FF3

这个是有效的:

SELECT TO_DATE('1985-02-07T00:00:00', 'YYYY-MM-DD"T"HH24:MI:SS')
FROM dual;

我不知道是否有一种方法可以在 TO_DATE() 中忽略小数秒,因此我使用字符串操作函数将它们去除:

SELECT TO_DATE(SUBSTR('1985-02-07T00:00:00.000Z', 1, 19), 'YYYY-MM-DD"T"HH24:MI:SS')
FROM dual;

5
SELECT to_timestamp_tz('2012-08-08T09:06:14.000-07:00','YYYY-MM-DD"T"HH24:MI:SS.FF3TZR')
FROM dual;

External table DDL,
extract_date char(29) DATE_FORMAT timestamp WITH TIMEZONE mask 'YYYY-MM-DD"T"HH24:MI:SS.FF3TZR'

1
很好的使用了 _tz 函数。不过我必须使用这个:'YYYY-MM-DD"T"HH24:MI:SS.FF3TZHTZM'。 - josh-cain

-1

如果您想以日期时间格式获取字符串,请尝试以下方法...

select to_char(TO_DATE('2012-06-26T00:00:00.809Z', 'YYYY-MM-DD"T"HH24:MI:SS".""ZZZZ"'),'yyyy-MM-dd hh:mm:ss PM') as EVENT_DATE from dual

EVENT_DATE
-----------------------
2012-06-26 12:06:00 AM

只需使用日期即可...

select TO_DATE('2012-01-06T00:00:00.809Z', 'YYYY-MM-DD"T"HH24:MI:SS".""ZZZZ"') from dual

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接