1. 复现:springboot配置了多数据源,连接了别人的一个mysql库,其版本为5.7.32-log,其日期可以存储格式并未限制,所以有很多的错误日期,如00-00-00,2021-00-23,或者2021-08-40这种错误数据,执行sql返回值会报错如下
Caused by: com.mysql.cj.exceptions.WrongArgumentException: MONTH
at sun.reflect.GeneratedConstructorAccessor170.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61)
at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105)
at com.mysql.cj.result.SqlDateValueFactory.localCreateFromDate(SqlDateValueFactory.java:85)
at com.mysql.cj.result.SqlDateValueFactory.localCreateFromDate(SqlDateValueFactory.java:50)
at com.mysql.cj.result.AbstractDateTimeValueFactory.createFromDate(AbstractDateTimeValueFactory.java:67)
at com.mysql.cj.protocol.a.MysqlTextValueDecoder.decodeDate(MysqlTextValueDecoder.java:71)
at com.mysql.cj.protocol.result.AbstractResultsetRow.decodeAndCreateReturnValue(AbstractResultsetRow.java:90)
at com.mysql.cj.protocol.result.AbstractResultsetRow.getValueFromBytes(AbstractResultsetRow.java:241)
at com.mysql.cj.protocol.a.result.TextBufferRow.getValue(TextBufferRow.java:132)
... 150 common frames omitted
Caused by: java.lang.IllegalArgumentException: MONTH
at java.util.GregorianCalendar.computeTime(GregorianCalendar.java:2648)
at java.util.Calendar.updateTime(Calendar.java:3393)
at java.util.Calendar.getTimeInMillis(Calendar.java:1782)
at com.mysql.cj.result.SqlDateValueFactory.localCreateFromDate(SqlDateValueFactory.java:82)
... 156 common frames omitted
2. 可能原因:应该是,我的MySQL的jdbc驱动为8.0版本的,mysql8.0对错误日期做了严格校验导致无法解析
3.解决:
1.可以通过修改数据库错误日期为正确日期即可解决 ,但是数据库不是我们系统,想推动其他系统修改他们那老掉牙的bug,被他们以各种理由搪塞了(什么好几年前的问题了,他解决不了之类的…)。
2.还可以写sql时通过对日期字段进行格式化DATE_FORMAT(c.pre_sign_date,’%Y-%m-%d %H:%i:%s’) 解决 :
如
select
id
DATE_FORMAT(c.pre_sign_date,'%Y-%m-%d %H:%i:%s') pre_sign_date
from product c