场景
同时保存一条数据在MySQL和Redis中,JAVA系统中显示Redis和MySQL数据差了一秒,即MySQL比Redis中快了一秒。
复现
我们系统中MySQL的时间类型用的是timestamp,问题是一样的。
CREATE TABLE `test_date` (`id` int(11) NOT NULL AUTO_INCREMENT,`date` datetime DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4mysql> INSERT INTO `test`.`test_date` (`date`) VALUES ('2022-12-05 11:40:49');
Query OK, 1 row affected (0.04 sec)mysql> INSERT INTO `test`.`test_date` (`date`) VALUES ('2022-12-05 11:40:49.449');
Query OK, 1 row affected (0.04 sec)mysql> INSERT INTO `test`.`test_date` (`date`) VALUES ('2022-12-05 11:40:49.500');
Query OK, 1 row affected (0.09 sec)mysql> SELECT * FROM test.test_date;
+----+---------------------+
| id | date |
+----+---------------------+
| 1 | 2022-12-05 11:40:49 |
| 2 | 2022-12-05 11:40:49 |
| 3 | 2022-12-05 11:40:50 |
+----+---------------------+
3 rows in set (0.00 sec)
原因
存储MySQL时,使用的是MyBatis plus,存储的时间会有毫秒数。
解决方案
方案一
入库时设置时间的毫秒值为0
/*** 设置时间的毫秒值为0** @param date* @return*/
public static Date getPreciseTime(Date date) {// 日历对象Calendar c = Calendar.getInstance();// 设置时间c.setTime(date);// 设置毫秒值为0c.set(Calendar.MILLISECOND, 0);return c.getTime();
}
方案二(未验证)
设置数据库精度
参考:
解决时间字段存入MySQL数据库时间差一秒的问题_ob date类型 差1秒-CSDN博客