现象

在20240310 凌晨2-3点间写入数据(比如now()生成2024-03-10 02:40:00 这样的时间数据), 在进行查询时,查到 202403-10 2-3点间的日期数据,会报Caused by: java.sql.SQLException: HOUR_OF_DAY: 2 -> 3 的错误。

原因

使用mysql-connector-java.jar版本8.x以上版本,和mysql建立连接时未设置时区(serverTimezone=GMT%2B8),GMT+8是北京时区,CTT是上海时区。

详见:https://blog.csdn.net/lan861698789/article/details/104770001

方案

排查java服务个性化配置,确认mysql连接串中是否缺失serverTimezone参数。

正例

jdbc:mysql://xxx.xxx.xxx.xxx:3306/db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&serverTimezone=CTT
jdbc:mysql://xxx.xxx.xxx.xxx:3306/db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2B8
jdbc:mysql://xxx.xxx.xxx.xxx:3306/db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&serverTimezone=ASia/Shanghai

反例

jdbc:mysql://xxx.xxx.xxx.xxx:3306/db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull

修改个性化配置增加serverTimezone=GMT%2B8,使用&进行参数拼接。