You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle中VARCHAR类型ISO日期转DATE类型的报错解决咨询

解决Oracle中ISO格式VARCHAR转DATE的问题

我来帮你搞定这个Oracle日期转换的坑!先拆解你遇到的两个错误,再给你靠谱的解决办法:

第一个错误:ORA-01861: literal does not match format string

你用TO_DATE('2018-03-23T00:00:00.000+00:00','DD-MM-YYYY')的时候,格式字符串DD-MM-YYYY和输入的ISO字符串完全不匹配——输入是年-月-日T时:分:秒.毫秒+时区的格式,而你告诉Oracle按日-月-年来解析,这肯定会报错啊!

另外要注意:TO_DATE不支持解析时区信息,所以哪怕格式串写对了,也处理不了后面的+00:00部分。

正确写法(两种可选)

  1. 如果你只需要日期部分(忽略时间和时区),可以直接截取字符串前10位:
INSERT INTO DATE_TEMP (DATE_VALUE) 
VALUES (TO_DATE(SUBSTR('2018-03-23T00:00:00.000+00:00', 1, 10), 'yyyy-mm-dd'));
  1. 如果你需要保留时间部分并正确处理时区(转成会话/数据库时区的DATE),先转成带时区的时间再转DATE:
INSERT INTO DATE_TEMP (DATE_VALUE) 
VALUES (CAST(TO_TIMESTAMP_TZ('2018-03-23T00:00:00.000+00:00', 'yyyy-mm-dd"T"hh24:mi:ss.ff3TZH:TZM') AS DATE));

第二个错误:ORA-03001: unimplemented feature

这个错误大概率是因为你用的Oracle版本对TO_TIMESTAMP_TZ的格式串解析有兼容性问题,尤其是时区部分的写法。换一种拆分的方式就能解决:先解析时间戳部分,再手动指定时区。

正确写法

INSERT INTO DATE_TEMP (DATE_VALUE) 
VALUES (
    CAST(
        FROM_TZ(
            TO_TIMESTAMP(SUBSTR('2018-03-23T12:34:56.123+00:00', 1, 23), 'yyyy-mm-dd"T"hh24:mi:ss.ff3'),
            '+00:00'
        ) AS DATE
    )
);

这里的逻辑是:先截取到毫秒部分(前23位)转成TIMESTAMP,再用FROM_TZ给它加上时区+00:00,最后转成DATE类型。

通用总结

  • 永远记住:TO_DATE的格式字符串必须和输入字面量完全匹配,而且它不处理时区
  • 带时区的ISO字符串,正确的处理流程是:先转成TIMESTAMP WITH TIME ZONE,再转换为DATE(转换时Oracle会自动根据会话时区或数据库时区调整时间)
  • 如果你的Oracle版本较老,优先用FROM_TZ+TO_TIMESTAMP的组合,比直接用TO_TIMESTAMP_TZ更稳妥

内容的提问来源于stack exchange,提问作者Wanna Coffee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:51:10