由一个非法日期引起的线上问题

doMore 6 2026-07-07

由一个非法日期引起的线上问题

上周在生产环境一个存在很久的业务突然在告警群里面爆出一个异常,异常信息如下:

// 异常信息如下:
org.springframework.dao.TransientDataAccessResourceException: Error attempting to get column 'receive_time' from result set.  Cause: java.sql.SQLException: DAY_OF_MONTH
; DAY_OF_MONTH; nested exception is java.sql.SQLException: DAY_OF_MONTH

这个业务是通过消息队列接收,然后进行一些数据统计,当日虽然有发版,但是这块已经近三个月没有动过了。本以为是因为发版导致的未知的地方影响到了。但是最终排查结果真的让人哭笑不得。是一个运维人员手动提交了一个非法日期,更新sql如下:

update dispatch_order set receive_time = '2026-07-0 16:04:12' where id = 123;

正常的日期格式应该是yyyy-MM-dd HH:mm:ss,所以这里的2026-07-0 16:04:12是一个非法日期。但是 mysql 是允许插入的,只是在查询的时候 JAVA Mysql 驱动会报错不能格式化这种日期。更可气的是当时所用的数据库查询工具 DBeaver 自动将这个日期转换成了 ‘2026-06-30 16:04:12’ 完全看不出错误。

注意:线上执行 sql 的时候 一定要谨慎检查,提交人和审核人都需要尽到自己的责任,不然这种莫名的错误开发真的是很难查!!!