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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 最近在项目中看到一个问题,就是某个时间通过代码赋值毫秒数,然后再入库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以及之后版本,毫秒数会自动四舍五入,如果你的业务对于日期时间很敏感,那么就要注意了!

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
关系型数据库 MySQL
MySQL对小数进行四舍五入等操作
MySQL对小数进行四舍五入等操作
193 0
|
SQL 关系型数据库 MySQL
如何解决mysql警告:“ InnoDB:page_cleaner:1000毫秒的预期循环用了XXX毫秒设置可能不是最佳的”?
如何解决mysql警告:“ InnoDB:page_cleaner:1000毫秒的预期循环用了XXX毫秒设置可能不是最佳的”?
3322 0
|
云安全 关系型数据库 MySQL
如何解决mysql服务经常会自动终止的问题
最近在帮客户网站搬家的时候遇到一个比较奇怪的问题,网站搬家后服务器的mysql服务偶尔会莫名其妙的自动终止,而重启服务会报“ERROR! The server quit without updating PID file”这个错误,开始认为对方的服务器被攻击了,经过一番排查发现并没有;
2629 0
如何解决mysql服务经常会自动终止的问题
|
SQL 关系型数据库 MySQL
mysql查询优化实战:查询用时一分半降到三毫秒
项目中的课程预约记录查询功能,线下门店反馈说进入到页面需要等2分钟
mysql查询优化实战:查询用时一分半降到三毫秒
|
存储 SQL 监控
MySQL的触发器——自动智能化的数据维护
MySQL的触发器——自动智能化的数据维护
315 0
MySQL的触发器——自动智能化的数据维护
|
存储 运维 关系型数据库
头大了,Mysql写入数据十几秒后被自动删除了
事情是这样的,在公司内部新开发了一个功能还没有上线,目前部署在测试环境,Node服务会开启一个定时任务,每5分钟会处理好一部分数据写入到mysql数据库中。
267 0
头大了,Mysql写入数据十几秒后被自动删除了
|
存储 SQL 监控
自动,MySQL触发器,完整详细可收藏
自动,MySQL触发器,完整详细可收藏
自动,MySQL触发器,完整详细可收藏
|
关系型数据库 MySQL
MariaDB MySQL变量取值避免四舍五入的方法
MariaDB MySQL变量取值避免四舍五入的方法
289 0
|
关系型数据库 MySQL
MySQL:自动维护create_time和update_time字段
通过建表语句设置,让mysql自动维护这两个字段,那么编程的时候也能少写一部分代码
144 0
|
JSON 监控 关系型数据库
zabbix低自动发现--监控mysql多实例(二十九)
zabbix低级自动发现监控mysql多实例 1.低级自动发现概念 低级自动发现本身就是一个key,在这个自动发现规则中包含有很多个监控原型,这些的监控原型都是依靠于自动发现规则根据各种过滤器最后匹配到的结果进行监控 低级自动发现经常适用于在同一台机器上有很多重复的监控项,人工操作非常繁重,这时候就可以配置一个低级自动发现,将自动发现做成模板,让对应的主机进行链接,经过一段时间的扫描后会自动的加入到监控中
675 0
zabbix低自动发现--监控mysql多实例(二十九)

推荐镜像

更多