字符转日期并提取近两年数据:SQL报ORA-01861错误求助
问题分析与解决方法
错误原因
你写的SQL里,LOADED_DATE是char(8)类型的字符串,而ADD_MONTHS(SYSDATE,-24)返回的是日期类型。Oracle会自动尝试把字符串转成日期,但用的是当前会话默认的日期格式(比如可能是DD-MON-RR这类),和你的LOADED_DATE的YYYYMMDD格式不匹配,所以抛出ORA-01861: 文字与格式字符串不匹配的错误。
另外,就算隐式转换成功,这种写法也会让LOADED_DATE上的索引失效(如果有的话),对于百万行的大表来说,查询效率会极低。
正确解决方案
推荐把日期转成和LOADED_DATE一致的字符串格式进行比较,这样类型匹配,还能利用索引提升性能,适合大表场景:
SELECT TO_DATE(LOADED_DATE, 'YYYYMMDD') FROM ELLIPSE.MSF26A WHERE LOADED_DATE >= TO_CHAR(ADD_MONTHS(SYSDATE, -24), 'YYYYMMDD')
说明
TO_CHAR(ADD_MONTHS(SYSDATE, -24), 'YYYYMMDD'):把近两年前的日期转换成YYYYMMDD格式的字符串,和LOADED_DATE的格式完全一致,直接比较不会有转换错误。- 这种写法如果
LOADED_DATE上建有索引,Oracle可以直接使用索引扫描,大幅提升百万行数据的查询速度。
不推荐的写法(仅作参考)
如果一定要在WHERE子句里转换LOADED_DATE,可以这样写,但要确保所有LOADED_DATE的值都是YYYYMMDD格式,没有脏数据,同时这种写法会导致全表扫描,性能很差:
SELECT TO_DATE(LOADED_DATE, 'YYYYMMDD') FROM ELLIPSE.MSF26A WHERE TO_DATE(LOADED_DATE, 'YYYYMMDD') >= ADD_MONTHS(SYSDATE, -24)
内容的提问来源于stack exchange,提问作者wolfmansbrother505
相关产品推荐
相关产品推荐

