我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Mysql DateTime 查询问题解析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Mysql DateTime 查询问题解析

正文

 
 public static final LocalTime MAX;
 
 public static final LocalDateTime MAX = LocalDateTime.of(LocalDate.MAX, LocalTime.MAX);

我们可以看到 LocalTime 和 LocalDateTime 的精度是可以去到 9 也就是达到纳秒

但是为什么我们经常打印出来的时候往往只有小数点后三位、也就是毫秒

 LocalDateTime now = LocalDateTime.now();
 System.out.println(now);

调用System的currentTimeMillis

我们看到源码最终还是调用了 System的currentTimeMillis

 @Override
 public long millis() {
     return System.currentTimeMillis();
 }
 @Override
 public Instant instant() {
     return Instant.ofEpochMilli(millis());
 }

最近测试环境中出现了个时间精度的问题、计算某个流程所花费的时间的时候得出了负数、因为存储该字段的类型设置了无符号、导致插入的时候报错、超出该类型的值的范围。

当时的第一反应是流程对应的步骤是不是分别在不同的容器中执行、容器之间是否存在时间差。

后面排查所有的步骤均执行在同一个容器中、日志打印的时间和sql插入的值均没啥差异。select 出来的值没有打印出来。

后面看到其中日志打印insert 的值的秒比数据库中的秒要少一秒。然后发觉没有设置 dateTime 的精度

这个其实是录入表的同事遗漏了、原本设计表结构是有6位精度的(规范要求)。

后面补上精度、顺手将无符号也去掉

mysql 中的 dateTime 精度默认为 0 、最大可以去到 6。

如果入参的精度大于 dateTime 的精度、那么将会进行四舍五入。

Mysql DateTime 查询问题解析

小结

插入的时候、如果输入的精度比声明的精度高、那么则会对其进行四舍五入

查询

值得注意的是、LocalTime | LocalDateTime 的 MAX 是 9位 的、如果

 drop table mqst1;
 create table mqst1
 (
     id         int      null,
     createtime datetime(0) null
 );
 INSERT INTO test_schema.mqst1 (id, createtime) VALUES (1, '2021-10-01 21:08:08.123');
 INSERT INTO test_schema.mqst1 (id, createtime) VALUES (1, '2021-10-01 23:59:59.567');
 INSERT INTO test_schema.mqst1 (id, createtime) VALUES (2, '2021-10-02 00:00:00.000');
 select *
 from mqst1
 where createtime >= '2021-10-01 00:00:00'  and createtime <= '2021-10-01 23:59:59.999999';
 select *
 from mqst1
 where createtime >= '2021-10-01 00:00:00' and createtime <= '2021-10-01 23:59:59.9999995';

第二条的查询就最后的参数比第一条的时间多了一个 5

首先看插入结果

Mysql DateTime 查询问题解析

那么第一条的查询结果是只有一条

第二条的查询结果却是 3 条。

因为 mysql 将字符串转换成 dateTime 的时候使用的是 6 位的精度、超过六位的才会四舍五入、所以导致第二条的查询条件变为 10-02 00:00:00

我们将 dateTime 的精度改为 2

 createtime datetime(2) null

Mysql DateTime 查询问题解析

那么第一条的查询结果为两条

而第二条的查询结果还是为三条

即使将精度改为6也是这样的结果

总结

对于查询而已、mysql 会对 string 的转换如果超出 6 位 多出的会进行四舍五入、然后才会去表中进行比较

事实上对于大多数场景而已、Java 提供的毫秒级别的时间以及能满足大多数场景了、对应到 db 存储时间到精度、

建议直接 6 会比较省心点吧、跟 Mysql 做字符串转换 dateTime 的时候一样。

查询到时候需要注意的是如果上限被包含进去、需要考虑精度是否超过 Mysql 的最大精度、如果超过了则可能你会被舍入

 System.out.println(LocalDateTime.of(LocalDate.now(), LocalTime.MAX).withNano(999999000));

以上就是Mysql DateTime查询问题解析的详细内容,更多关于Mysql DateTime的资料请关注我们其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Mysql DateTime 查询问题解析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Mysql DateTime 查询问题解析

目录正文调用System的currentTimeMillis小结查询总结正文javascript/*** The maximum supported {@code LocalTime}, javascript'23:59:59.999999
2022-11-27

MySQL慢查询优化问题-解决办法

目的根据发现的问题,找到原因,然后对症下药借鉴资料:没用过慢查询日志,别说自己做过数据库优化慢查询日志概念记住七个字搞定索引失效问题发现问题(主动/被动)问题点:数据库查询过程中速度过慢的SQL语句主动:数据库默认情况下slow_query_log的值为OFF
MySQL慢查询优化问题-解决办法
2019-08-01

怎么分析Mysql中的嵌套子查询问题

小编今天带大家了解怎么分析Mysql中的嵌套子查询问题,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起深入学习“怎么分析Mysql中的嵌套子查询
2023-06-29

MySql中的连接查询问题

目录连接查询连接查询的分类笛卡尔积现象内连接之等值连接内连接之自连接内连接之非等值连接外连接内连接和外连接的特点多表连接总结连接查询当进行多表连接查询时 需要指定字段所属的表 , 可以提高查询效率 , 如果不指定字段所属的表 , 数据库会
2023-03-20

mysql倒序查询效率问题如何解决

在执行MySQL倒序查询时,主要的性能问题通常出现在ORDER BY子句上,特别是在大型数据集上。以下是一些解决这些性能问题的方法:索引:确保按照逆序查询的列上创建了适当的索引。这将帮助MySQL优化查询,并且可以显著提高性能。使用LIMI
mysql倒序查询效率问题如何解决
2024-04-12

MySql中的连接查询问题怎么解决

本文小编为大家详细介绍“MySql中的连接查询问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“MySql中的连接查询问题怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。连接查询当进行多表连接查询
2023-07-05

mysql之跨库关联查询问题怎么解决

这篇文章主要介绍了mysql之跨库关联查询问题怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇mysql之跨库关联查询问题怎么解决文章都会有所收获,下面我们一起来看看吧。1、解决方案mysql是不支持跨库
2023-07-05

MySQL中如何解决慢查询和性能问题

解决MySQL中慢查询和性能问题的方法有很多,以下是一些常见的解决方案:使用合适的索引:索引能够加快数据的检索速度,提高查询性能。在使用索引时,需要根据查询条件和表结构来选择合适的索引类型,避免创建过多或不必要的索引。优化SQL查询语句:对
MySQL中如何解决慢查询和性能问题
2024-03-06

MySQL datetime精度导致查询数据错误怎么解决

MySQL的datetime数据类型默认精度是秒,如果查询数据错误,可能是由于精度不匹配导致的。解决方法有两种:修改数据类型精度:将datetime数据类型修改为timestamp数据类型。timestamp数据类型的精度是毫秒级别的,可以
MySQL datetime精度导致查询数据错误怎么解决
2024-04-09

mysql之跨库关联查询(dblink)问题

目录1、解决方案2、操作1、开启FEDERATED引擎2、建表时加上连接3、缺点总结1、解决方案mysql是不支持跨库连接的,如果我们实在要连接的话可以用dblink方式。解释:dblink就是我们在创建表的时候连接到我们的远程库,然后
2023-03-09

编程热搜

目录