Oracle 19c执行SQL报ORA-01861字面量与格式字符串不匹配求助
ORA-01861错误原因定位
该错误本质是Oracle执行隐式类型转换时,待转换的字符串和要求的日期格式不匹配导致转换失败,对应你写的SQL有3个明确触发问题的点:
- 日期字段和字符串隐式转换风险:你将
DATE类型的字段直接和字符串'20220101'做大小比较,Oracle会自动尝试把字符串按当前会话默认的NLS_DATE_FORMAT格式转成日期,绝大多数生产环境默认日期格式是DD-MON-RR,和YYYYMMDD格式不匹配,直接触发转换报错。 - 非法的日期比较逻辑:你写了
DATE != 'None'的判断,DATE是日期类型字段,只能存储合法日期或者NULL值,不可能存储字符串'None'。执行这个判断时Oracle会尝试把'None'转成日期类型,这个字符串完全不符合日期格式规则,直接触发ORA-01861报错。 - 关键字冲突:
DATE是Oracle的内置保留关键字,直接作为字段名使用不加引用时,容易出现解析歧义。
另外你的过滤逻辑存在冗余:前面写了DATE >= '20220101',后面又限定日期在上月整月范围,两个条件存在重叠,没有实际意义。
修复方案
修正后的过滤排序代码如下:
WHERE "DATE" >= TO_DATE('20220101', 'YYYYMMDD') AND "DATE" BETWEEN ADD_MONTHS(TRUNC(SYSDATE, 'mm'), -1) AND LAST_DAY(ADD_MONTHS(TRUNC(SYSDATE, 'mm'), -1)) AND QT_MOCK_DATA IS NOT NULL ORDER BY "DATE" DESC
修复点说明:
- 所有日期值比较都使用
TO_DATE()做显式类型转换,明确指定YYYYMMDD格式掩码,完全不依赖会话默认的日期格式配置,从根源避免隐式转换报错。 - 对作为字段名使用的保留字
DATE加双引号引用,避免解析歧义。 - 删掉了无效的
DATE != 'None'判断,日期类型的空值判断统一使用IS NULL/IS NOT NULL即可,不需要额外和字符串'None'做比较。 - 可以按需调整过滤逻辑:如果你的业务需求就是查询上月的数据,直接删掉
"DATE" >= TO_DATE('20220101', 'YYYYMMDD')这个冗余条件即可,减少不必要的判断提升查询效率。
内容的提问来源于stack exchange,提问作者Caroline
相关产品推荐
相关产品推荐

