java.sql.SQLException: DAY_OF_MONTH或Caused by: java.sql.SQLException: MONTH

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值