DB2中使用DAYS函数计算日期差时出现-180错误的求助
DB2错误-180:日期值无效的原因及解决办法
错误原因
你的表中存在不符合yyyymmdd格式的整数日期数据,这是触发-180错误的核心原因:
- 日期字段是整数类型,执行
SUBSTR时DB2会先把整数转成字符串。如果表中有非8位的数值(比如200801、0),截取后会得到不完整的年/月/日部分,拼接出2008-01-这类无效日期;如果是8位但本身是不存在的日期(比如20230230),转换时也会失败。 - 同事的表数据全是合规的8位有效日期,所以语句能正常运行,而你的表存在异常数据,导致报错。
修复方案
1. 过滤无效数据后再查询
先排除不符合规范的记录,避免无效日期干扰:
SELECT CHAR(ID_T9999), CHAR('|'), CHAR(IDENT_USER), CHAR('|'), CHAR(DAT_START_CALC_PHYS), CHAR('|'), CHAR(DAT_END_CALC_PHYS), CHAR('|'), CHAR(LENGTH_PHYS) FROM T9999 WHERE -- 限定日期范围在合理区间,过滤非8位或无效数值 DAT_START_CALC_PHYS BETWEEN 19000101 AND 21001231 AND DAT_END_CALC_PHYS BETWEEN 19000101 AND 21001231 -- 直接转换整数为日期,替代原有的SUBSTR拼接逻辑 AND DAYS(DATE(CHAR(DAT_END_CALC_PHYS))) - DAYS(DATE(CHAR(DAT_START_CALC_PHYS))) > 10 ;
2. 简化日期转换逻辑(更高效)
无需用SUBSTR拼接字符串,DB2支持直接将8位整数转为日期,简化语句同时提升性能:
SELECT CHAR(ID_T9999), CHAR('|'), CHAR(IDENT_USER), CHAR('|'), CHAR(DAT_START_CALC_PHYS), CHAR('|'), CHAR(DAT_END_CALC_PHYS), CHAR('|'), CHAR(LENGTH_PHYS) FROM T9999 WHERE -- 用DEC函数确保整数转为8位十进制数,再转日期 DAYS(DATE(DEC(DAT_END_CALC_PHYS, 8, 0))) - DAYS(DATE(DEC(DAT_START_CALC_PHYS, 8, 0))) > 10 ;
3. 排查并修复异常数据
如果业务要求所有日期必须合规,可以先找出无效数据:
SELECT ID_T9999, DAT_START_CALC_PHYS, DAT_END_CALC_PHYS FROM T9999 WHERE -- 过滤长度非8位的数值 LENGTH(CHAR(DAT_START_CALC_PHYS)) != 8 OR LENGTH(CHAR(DAT_END_CALC_PHYS)) != 8 -- 过滤无法转换为有效日期的数值 OR DATE(CHAR(DAT_START_CALC_PHYS)) IS NULL OR DATE(CHAR(DAT_END_CALC_PHYS)) IS NULL;
修复这些异常数据后,原语句即可正常执行。
内容的提问来源于stack exchange,提问作者user6854154
相关产品推荐
相关产品推荐

