Oracle查询筛选昨日数据时遭遇ORA-01841错误求助
ORA-01841错误排查与解决(筛选昨日作业数据场景)
当用sysdate-TO_DATE(srvb.rectarih1,'YYYY/MM/DD')=1筛选昨日作业数据时触发ORA-01841错误,提示"(full) year must be between -4713 and +9999, and not be 0",本质是srvb.rectarih1字段里存在不符合YYYY/MM/DD格式的数据,导致TO_DATE转换时解析出了非法年份。
解决步骤:
排查脏数据
先找出字段里格式异常的记录,用正则匹配或者长度校验:-- 用正则筛选不符合YYYY/MM/DD格式的记录 SELECT rectarih1 FROM srvb WHERE NOT REGEXP_LIKE(rectarih1, '^\d{4}/\d{2}/\d{2}$'); -- 或者检查长度不符合10位的记录(含分隔符) SELECT rectarih1 FROM srvb WHERE LENGTH(TRIM(rectarih1)) != 10;修复脏数据
对查出的非法格式数据进行修正,比如补全缺失的年份、修正日期分隔符、删除无效值等,确保所有rectarih1的值都严格符合YYYY/MM/DD格式。优化筛选逻辑
替换原有的日期相减写法,改用更直观且安全的日期比较方式,避免隐式转换问题:WHERE TO_DATE(srvb.rectarih1,'YYYY/MM/DD') = TRUNC(sysdate) - 1或者用
TRUNC统一截断时间后再计算差值:WHERE TRUNC(sysdate) - TRUNC(TO_DATE(srvb.rectarih1,'YYYY/MM/DD')) = 1
内容的提问来源于stack exchange,提问作者Ksaxes
相关产品推荐
相关产品推荐

