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 的精度、那么将会进行四舍五入。

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也是这样的结果

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

来源:https://juejin.cn/post/7170484548424171556

标签:Mysql,DateTime,查询
0
投稿

猜你喜欢

  • 在 CentOS 7 中安装 MySQL 8 的教程详解

    2024-01-17 03:33:56
  • 在python中使用正则表达式查找可嵌套字符串组

    2021-10-07 07:02:06
  • python使用opencv在Windows下调用摄像头实现解析

    2021-01-08 04:13:01
  • Python使用扩展库pywin32实现批量文档打印实例

    2023-11-05 09:55:13
  • 利用python程序生成word和PDF文档的方法

    2023-08-26 13:31:44
  • javascript实现自动输出文本(打字特效)

    2024-02-25 18:25:14
  • JavaScript数组去重的方法总结【12种方法,号称史上最全】

    2024-05-09 15:02:46
  • 由日文出错的Bug,重新认识 Replace 函数

    2009-07-07 22:28:00
  • 一文了解你不知道的JavaScript闭包篇

    2024-02-23 11:37:36
  • Python3 虚拟开发环境搭建过程(图文详解)

    2021-11-19 00:34:51
  • javascript实现右下角广告框效果

    2024-04-17 10:25:08
  • Python实现字典按照value进行排序的方法分析

    2022-11-03 04:27:27
  • php实现HTML实体编号与非ASCII字符串相互转换类实例

    2023-11-15 06:12:14
  • 谈谈如何管理门户级网站的CSS/IMG/JS文件

    2009-09-03 11:48:00
  • Python Selenium 之关闭窗口close与quit的方法

    2023-11-14 01:28:06
  • python学习--使用QQ邮箱发送邮件代码实例

    2023-10-29 23:43:59
  • Python实现号码归属地查询功能

    2023-09-20 13:31:40
  • archlinux 罗技K380 F1-F12 功能键锁定(实现方法)

    2023-11-27 22:42:48
  • Python使用xlrd和xlwt实现自动化操作Excel

    2021-08-24 10:54:19
  • Python selenium模拟手动操作实现无人值守刷积分功能

    2021-07-30 23:54:08
  • asp之家 网络编程 m.aspxhome.com