Mysql DateTime 查询问题解析
作者:CoderLi 发布时间:2024-01-23 06:00:53
/**
* The maximum supported {@code LocalTime}, '23:59:59.999999999'.
* This is the time just before midnight at the end of the day.
*/
public static final LocalTime MAX;
/**
* The maximum supported {@code LocalDateTime}, '+999999999-12-31T23:59:59.999999999'.
* This is the local date-time just before midnight at the end of the maximum date.
* This combines {@link LocalDate#MAX} and {@link LocalTime#MAX}.
* This could be used by an application as a "far future" date-time.
*/
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 的精度、那么将会进行四舍五入。
小结
插入的时候、如果输入的精度比声明的精度高、那么则会对其进行四舍五入
查询
值得注意的是、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
首先看插入结果
那么第一条的查询结果是只有一条
第二条的查询结果却是 3 条。
因为 mysql 将字符串转换成 dateTime 的时候使用的是 6 位的精度、超过六位的才会四舍五入、所以导致第二条的查询条件变为 10-02 00:00:00
我们将 dateTime 的精度改为 2
createtime datetime(2) null
那么第一条的查询结果为两条
而第二条的查询结果还是为三条
即使将精度改为6也是这样的结果
System.out.println(LocalDateTime.of(LocalDate.now(), LocalTime.MAX).withNano(999999000));
来源:https://juejin.cn/post/7170484548424171556


猜你喜欢
- 打开网页,然后将javascript:document.body.contentEditable='true';
- golang 的fmt 包实现了格式化I/O函数,类似于C的 printf 和 scanf定义示例类型和变量type Human struc
- 看python社区大妈组织的内容里边有一篇讲python内存优化的,用到了__slots__。然后查了一下,总结一下。感觉非常有用pytho
- 最近写了两个管理后台的前端页面,其中有一个管理后台,左侧菜单导航和右侧内容页是两个iframe,需求是,点击上面的主导航时,左侧iframe
- .data文件格式.data文件是用来存储数据的一种文件格式。之前通常数据是用逗号隔开或tab健隔开的格式,现在也可能是文本文件格式或二进制
- 如何在本地机器上创建缓存?用法到是很简单,只需先创建Stream对象的实例,然后开始写入数据即可: Dim str&n
- 在python中json分别由列表和字典组成,本文主要介绍python中字典与json相互转换的方法。使用json.dumps可以把字典转成
- 一、前言嗨,大家好,我是新发。有同学私信我让我写一篇Unity网格相关的教程,那我就带大家来一次Unity的网格探险之旅吧~二、Hello
- 在昨天关于substring的blog中有如下一段代码:也许你已经发现,在Python 3中其实有办法只用一行完成函数:>>&g
- 本文实例为大家分享了Python3实现飞机大战游戏的具体代码,供大家参考,具体内容如下1、主程序:plane_main.pyimport p
- Python作为一种功能强大的编程语言,因其简单易学而受到很多开发者的青睐。那么,Python 的应用领域有哪些呢?概括起来,Python的
- 题目:轮盘分为三部分: 一等奖, 二等奖和三等奖;轮盘转的时候是随机的,如果范围在[0,0.08)之间,代表一等奖,如果范围在[0.08,0
- async / await是ES7的重要特性之一,也是目前社区里公认的优秀异步解决方案。目前,async / await这个特性已经是sta
- 脚本1:这两天用python写了一个删除指定目录下过期时间的脚本。也可能是我初学python,对python还不够熟习,总觉得这个脚本用sh
- ACCESS有个BUG,那就是在使用 like 搜索时如果遇到日文就会出现“内存溢出”的问题,提示“80040e14/内
- 上次介绍了如何通过钉钉进行群通知,有同学反馈自己更习惯使用企业微信或公司使用了企业微信,希望也能出个基于Python的企业微信的群通知教程,
- 本文适用场景:想用Tkinter开发界面程序并屏幕居中,但没找到相应的API。这两天玩了玩Tkinter,感觉不错,就是屏幕居中这个问题在网
- 本篇文章主要介绍了Python 通过selenium实现毫秒级自动抢购的示例代码,通过扫码登录即可自动完成一系列操作,抢购时间精确至毫秒,可
- PHP 5.0.0 和PHP 4.0.38 于2004年7月13日同时发布,这是一个值得我们PHP爱好者的一大喜讯。期盼已久的PHP5终于出
- 本章给大家在项目使用时候,常见的一种情况解决案例,即是当我们调用多个线程,使用了同一个函数去处理数据的时候,有些用函数已经处理完成,但是有些