MySQL毫秒数自动四舍五入了解一下

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 最近在项目中看到一个问题,就是某个时间通过代码赋值毫秒数,然后再入库MySQL,查询MySQL发现竟然时间的日期变了,究竟是什么原因导致的?让我们来一探究竟。

现象:
首先,涉及到的赋值代码片段:

Calendar calendar = Calendar.getInstance();  
calendar.setTime(day);  
calendar.set(Calendar.HOUR_OF_DAY,calendar.getMaximum(Calendar.HOUR_OF_DAY); 
calendar.set(Calendar.MINUTE, calendar.getMaximum(Calendar.MINUTE));  
calendar.set(Calendar.SECOND, calendar.getMaximum(Calendar.SECOND));  
calendar.set(Calendar.MILLISECOND, calendar.getMaximum(Calendar.MILLISECOND));
return calendar.getTime();

可以看到,毫秒是取了最大的999赋值,比如就会产生一个这样的时间:
2022-01-13 23:59:59.999
特别需要注意的是,如果是通过Calendar赋值,即使没有赋值毫秒数,也会生成当前时间那一刻对应的毫秒数,所以,毫秒数就有可能是0-999之间的某一个值。
66.png
然后入库,查询可以看到日期变了
11.png
为什么会这样?我们先找下MySQL官方文档看下有没有相关解释,于是找到如下说明,5.6/5.7/8.0版本都是一样,地址:MySQL 5.6 Reference Manual
22.png

  • Conversion to a DATE value takes fractional seconds into account and rounds the time part. For example, '1999-12-31 23:59:59.499' becomes '1999-12-31', whereas '1999-12-31 23:59:59.500' becomes '2000-01-01'.

看到这一句就会明白,因为小数秒也就是上面的毫秒会发生四舍五入,入库才会出现上面的情况。
由于MySQL官网上最老版本的文档已经只有5.6版本的了,那么MySQL这一特性是否历来就是如此,还是后面版本改的?在网上找了下找到了之前MySQL 5.5版本的文档,地址:在线文档-mysql-5.5-en
33.png

  • Conversion to a DATE value discards the time part because the DATE type contains no time information.

参照对比,可见5.5版本的是丢弃不会考虑,也不会影响,入库日期不会发生变化。
知道了是什么原因造成的,也了解到版本间的差异,接下来测试下。
MySQL 5.5 :
44.png
MySQL 5.6 :
55.png
最后,测试表明与各版本文档所述一致,自MySQL5.6以及之后版本,毫秒数会自动四舍五入,如果你的业务对于日期时间很敏感,那么就要注意了!

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
关系型数据库 MySQL
MySQL对小数进行四舍五入等操作
MySQL对小数进行四舍五入等操作
62 0
|
SQL 关系型数据库 MySQL
如何解决mysql警告:“ InnoDB:page_cleaner:1000毫秒的预期循环用了XXX毫秒设置可能不是最佳的”?
如何解决mysql警告:“ InnoDB:page_cleaner:1000毫秒的预期循环用了XXX毫秒设置可能不是最佳的”?
1834 0
|
关系型数据库 MySQL
MariaDB MySQL变量取值避免四舍五入的方法
MariaDB MySQL变量取值避免四舍五入的方法
175 0
|
SQL 关系型数据库 MySQL
mysql查询优化实战:查询用时一分半降到三毫秒
项目中的课程预约记录查询功能,线下门店反馈说进入到页面需要等2分钟
mysql查询优化实战:查询用时一分半降到三毫秒
|
云安全 关系型数据库 MySQL
如何解决mysql服务经常会自动终止的问题
最近在帮客户网站搬家的时候遇到一个比较奇怪的问题,网站搬家后服务器的mysql服务偶尔会莫名其妙的自动终止,而重启服务会报“ERROR! The server quit without updating PID file”这个错误,开始认为对方的服务器被攻击了,经过一番排查发现并没有;
2317 0
如何解决mysql服务经常会自动终止的问题
|
存储 运维 关系型数据库
头大了,Mysql写入数据十几秒后被自动删除了
事情是这样的,在公司内部新开发了一个功能还没有上线,目前部署在测试环境,Node服务会开启一个定时任务,每5分钟会处理好一部分数据写入到mysql数据库中。
207 0
头大了,Mysql写入数据十几秒后被自动删除了
|
存储 SQL 监控
自动,MySQL触发器,完整详细可收藏
自动,MySQL触发器,完整详细可收藏
326 0
自动,MySQL触发器,完整详细可收藏
|
存储 SQL 监控
MySQL的触发器——自动智能化的数据维护
MySQL的触发器——自动智能化的数据维护
242 0
MySQL的触发器——自动智能化的数据维护
|
关系型数据库 MySQL
MySQL:自动维护create_time和update_time字段
通过建表语句设置,让mysql自动维护这两个字段,那么编程的时候也能少写一部分代码
108 0
|
SQL Oracle 关系型数据库
软件测试mysql面试题:什么是SQL中的自动增量?
软件测试mysql面试题:什么是SQL中的自动增量?
100 0

热门文章

最新文章