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 时间转换为客户端的本地时间 [重复]