ORA-01821: 本地时间的 ISO 8601 日期的日期格式无法识别错误

Posted

技术标签:

【中文标题】ORA-01821: 本地时间的 ISO 8601 日期的日期格式无法识别错误【英文标题】:ORA-01821: date format not recognized error for ISO 8601 date with local time 【发布时间】:2016-08-26 10:58:06 【问题描述】:

我正在尝试根据我的 Java 代码中的参数值转换 SQL 中的日期。但是,当执行以下查询时,我收到错误消息。请求您帮助我解决此问题。

 SELECT TO_DATE ('2015-08-26T05:46:30.488+0100',
 'YYYY-MM-DD"T"hh24:mi:ss.sTZH:TZM')
  FROM DUAL
  *
Error at line 2
ORA-01821: date format not recognized

日期和时间格式信息:

http://www.w3.org/TR/NOTE-datetime

【问题讨论】:

实际时间戳值中的"无效。您需要使用'2015-08-26T05:46:30.488+0100' 我现在已经删除了时间戳。它仍然给出同样的错误。 【参考方案1】:

您有两个问题:TO_DATE 无法识别任何时区组件或小数秒,您必须将其转换为带有时区的时间戳,而 .s 无论如何都不是您表示小数秒的方式,你需要.ff。有效格式模型are shown in the documentation。

把这些放在一起你可以做到:

SELECT TO_TIMESTAMP_TZ ('2015-08-26T05:46:30.488+0100',
 'YYYY-MM-DD"T"hh24:mi:ss.ffTZHTZM')
FROM DUAL;

TO_TIMESTAMP_TZ('2015-08-26T05:46:30.488+0100','YYYY-MM-DD"T"HH24:MI:SS.FFTZHTZ
-------------------------------------------------------------------------------
26-AUG-15 05.46.30.488000000 +01:00                                             

如果您真的希望它作为日期,您需要决定如何处理时区信息 - 或者假设它是本地时间(基本上忽略它),或者转换为 UTC 或其他时区。不过,您可能真的希望将其保留为带有时区的时间戳。

【讨论】:

更好地匹配格式,而不是依赖 Oracle 的猜测。即格式模型应该遵循字符串字面量的结构;格式模型应该以...ff+TZHTZM 结尾(如果它在文字参数中,+ 应该在模型中显式存在,并且如果在文字中它们之间没有 :,那么模型中的 THZ 和 TZM 之间应该没有 : )。在这种情况下,Oracle 猜对了,但有时却错了。 @mathguy - 在冒号上同意你的观点,我没有注意到这一点。不太确定 + 号;我不知道这是允许的(文档似乎没有提到它),而且 TZH 可以是积极的或消极的,所以我相信它已经暗示并且是多余的 - Oracle 不必猜测。我个人也会觉得它有点令人困惑,因为它充其量表示字符可以是 + 或 - (但我在格式模型中遇到了 AM/PM 的相同问题,所以也许这只是我!)。在to_char() 调用中明确包含它是错误的。但这当然值得一提,谢谢。 哦,我认为您对 +/- 的看法是完全正确的,我被迷住了。那是 TZH 的一部分,它不是逐字标记... :) 以防万一其他人想知道YYYY-MM-DD"T"HH24:MI:SS.FFTZHTZ 示例中的“T”(由引号包围的 T 字母)部分的作用:它只是一个文字,而不是特殊的字符 - ***.com/questions/28146645/…【参考方案2】:

嗯,错误信息非常具体。 Oracle 无法识别给定的日期格式YYYY-MM-DD"T"hh24:mi:ss.sTZH:TZM

您可以参考此页面以构建正确的日期格式:https://www.techonthenet.com/oracle/functions/to_date.php

【讨论】:

以上是关于ORA-01821: 本地时间的 ISO 8601 日期的日期格式无法识别错误的主要内容,如果未能解决你的问题,请参考以下文章

Javascript - 将 ISO8601 UTC 时间转换为客户端的本地时间 [重复]

这个Oracle查询为啥会报错:ora-01821 Date format not recognized

将时区偏移量(ISO 8601 格式)添加到原始日期时间

nginx访问日志格式

Swift - 从 ISO8601 日期字符串中检索时区

ISO 8601:时间和日期的表示标准