gpt4 book ai didi

MySQL 日期排序不一致

转载 作者:行者123 更新时间:2023-11-29 07:34:16 24 4
gpt4 key购买 nike

我在调试失败的集成测试时遇到了一个奇怪的问题。根据以下查询的排序方向 (ASC/DESC),我似乎得到不一致的结果:

SELECT u.id, u.last_updated FROM user u WHERE u.id IN (36, 37, 38, 39, 40) ORDER BY u.last_updated ASC;

上面的查询返回这些结果,这正如我所期望的:

id  last_updated
=======================
36 2015-07-15 19:45:34
37 2015-07-15 19:45:34
38 2015-07-15 19:45:34
39 2015-07-15 19:45:35
40 2015-07-15 19:45:35

但是,如果我将排序顺序从 ASC 切换为 DESC,我会得到以下结果:

id  last_updated
=======================
39 2015-07-15 19:45:35
40 2015-07-15 19:45:35
36 2015-07-15 19:45:34
37 2015-07-15 19:45:34
38 2015-07-15 19:45:34

就好像当查询按降序排列时,MySQL 无法区分精度超过秒的日期之间的差异。

如果我更改日期,使每个 last_updated 值之间有 1 秒的间隙,则排序在两个方向上都可以正常工作。

这些查询是通过基于 Grails/Hibernate 的应用程序执行的。如果我在应用程序中添加一些调试代码,我可以看到日期全部不同并且精确到 1 毫秒:

1436989535410, 1436989535646, 1436989534516, 1436989534990, 1436989534751

因此数据存储的精度足够......

用户表声明如下所示:

CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`last_updated` datetime NOT NULL,
...
)

我使用的是 MySQL 5.6.15。

在使用 H2 Java 内存数据库进行测试时,相同的查询/集成测试可以正常工作。

编辑:

有趣的是,看起来确实失去了一些精度。如果我运行以下查询:

SELECT u.id, u.last_updated, UNIX_TIMESTAMP(u.last_updated) FROM user u WHERE u.id IN (36, 37, 38, 39, 40) ORDER BY u.last_updated ASC;

我明白了:

id  last_updated         unix timestamp
=======================================
36 2015-07-15 19:45:34 1436985934
37 2015-07-15 19:45:34 1436985934
38 2015-07-15 19:45:34 1436985934
39 2015-07-15 19:45:35 1436985935
40 2015-07-15 19:45:35 1436985935

我猜 Hibernate 正在缓存更精确的预持久日期值,并在我尝试在应用程序中调试时将它们返回给我...

最佳答案

尝试将 last_updated 字段更改为 DATETIME(6) 而不是 DATETIME。这样你就可以获得微秒级的分辨率。 MySQL Reference.

关于MySQL 日期排序不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31439870/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com