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

PL/SQL执行报错ORA-01861: 字面量与格式字符串不匹配问题求助

ORA-01861报错问题排查与解决方案

错误根因定位

你最后一个AND条件里的to_date('01/011/2011','DD/MM/YYYY')存在直接的格式不匹配问题:

  • 指定的日期格式DD/MM/YYYY要求月份MM为2位数字
  • 传入的日期字面量中月份部分是011,为3位数字,Oracle解析时无法将3位数值匹配到2位的月份格式,直接触发ORA-01861报错。

通用排查思路

  • 先核对to_date函数传入的字面量与指定格式的位数是否一一对应:DD对应2位日、MM对应2位月、YYYY对应4位年,多余/缺失位数都会触发格式不匹配
  • 如果是动态传入的日期参数,先打印参数实际取值确认是否符合预期格式
  • 确认关联的日期字段类型:如果ab.bill_date本身是DATE类型,不要额外做to_date/to_char转换;如果是VARCHAR2类型存储的日期,要统一字段存储格式和查询时的转换格式
  • 排查是否存在隐式转换:比如DATE类型和字符串直接比较时,Oracle会根据会话参数NLS_DATE_FORMAT做隐式转换,不同会话的参数值不同也会偶发这类报错

解决方案

首先修正当前错误的日期字面量:
如果你要查询2011年11月1日,修改为:

AND ab.bill_date = to_date('01/11/2011','DD/MM/YYYY');

如果你要查询2011年1月1日,修改为:

AND ab.bill_date = to_date('01/01/2011','DD/MM/YYYY');

额外优化建议:

  • 可以用ANSI标准的日期字面量写法避免格式转换错误,比如DATE '2011-11-01',不需要指定格式,固定为YYYY-MM-DD格式,兼容性更强
  • 如果bill_date字段包含时分秒,直接等值匹配会漏掉同一天其他时分秒的数据,可以改为TRUNC(ab.bill_date) = DATE '2011-11-01'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 23:21:03