在 MYSQL 8 和 Spring boot 中处理日期比较,无需毫秒

问题描述 投票:0回答:1

我们正在将项目从 Mysql 5 升级到 Mysql 8。日期处理中的数据库查询出现奇怪的问题。

在 MySQL 5 上,将数据保存到数据库时,日期通常以 'yyyy-MM-dd HH:mm:ss' 格式保存,而不关心毫秒。

但是在Mysql 8上,日期在四舍五入毫秒后保存,假设如果日期是“2024-07-18 09:39:34.927”,那么在数据库中它将保存为“2024-07-18 09:39:35” '.

这导致 DAO 中的 get 调用出现问题。以下是 Dao 调用供参考。

@Query(“SELECT pts FROM TableName pts WHERE columnA = ?1 
       + ” AND columnB = ?2")
Entity getData(int val1, Date date);

这就是实体中日期列的定义方式

@Basic
@Column(name = "column_a", nullable = false)
@Temporal(TemporalType.TIMESTAMP)
private Date columnA;

这是日期列的 SQl 结构。

`column_a` datetime NOT NULL,

如果使用 date = '2024-07-18 09:39:34.927' 进行调用,则返回 null。

我找到了一种避免日期舍入的解决方案,即sqlmode=TIME_TRUNCATE_FRACTIONAL。这可以防止舍入,但问题仍然存在,因为在 JPA 查询中进行日期比较时,它仍然考虑毫秒。例如,数据保存为“2024-07-18 09:39:34”,但将根据日期字段的“2024-07-18 09:39:34.927”值进行比较。

但是,这可以通过在传递查询之前手动更改日期格式来解决。但是有很多这样的 JPA 调用,是否有任何配置级别的方法可以在 MYSQL 8 的 JPA 查询中不遵守毫秒? 或者,有什么正确的方法可以解决这个问题吗?

mysql spring-boot jpa spring-data-jpa mysql-8.0
1个回答
0
投票

在投入时间进行调试后,我确定了一个特定的 MySQL 变量 sendFractionalSeconds,它解决了问题。该变量必须显式设置为 false,以防止在查询数据或将数据保存到数据库时出现毫秒舍入。

要实现此解决方案,请按如下方式设置变量:

sendFractionalSeconds=false

更多详细信息,请参阅 MySQL 文档:Connector/J 和小数秒。

© www.soinside.com 2019 - 2024. All rights reserved.