【问题标题】:MySQL GROUP BY DIV result not consistentMySQL GROUP BY DIV 结果不一致
【发布时间】:2016-02-26 22:56:33
【问题描述】:

我正在尝试使用 GROUP BY DIV 以 1 天为间隔对数据进行分组,如本文所述: Grouping into interval of 5 minutes within a time range

乍一看还不错。 但是在比较 2 个不同日期间隔(但相交)的查询时,我注意到不一致。 首先,我使用从 2 月 1 日 00:00 到 2 月 26 日 00:00 的日期范围, 第二个我使用的日期范围是从 2 月 20 日 00:00 到 2 月 26 日 00:00

这两个查询在 2 月 20 日的值不同。但其余 (21 - 25) 是匹配的。

知道发生了什么以及如何解决它吗?

更新: 这是在二月每分钟生成虚拟数据的存储过程:

    DELIMITER $$

    CREATE DEFINER=`root`@`127.0.0.1` PROCEDURE `testdata`()
    BEGIN

    DECLARE gap int;
    DECLARE x bigint;
    SET gap = 60000;
    SET x = 1454265000000;

    CREATE TABLE IF NOT EXISTS testdata (
        timestamp bigint(20) default NULL,
        value int(20) default NULL
    ) 
    ENGINE=MyISAM DEFAULT CHARSET=utf8;

    WHILE x  <= 1456770599000 DO
        INSERT INTO testdata(timestamp, value) VALUES (x, FLOOR(RAND() * (270 + 1)) + 30);
        SET x = x + gap; 
    END WHILE;

    select x;

    END

这里有 2 个查询来比较 2 个区间:

    select from_unixtime(timestamp / 1000), count(value) from testdata where timestamp >= 1454265000000 and timestamp <= 1456770599000 group by timestamp div 86400000;
    select from_unixtime(timestamp / 1000), count(value) from testdata where timestamp >= 1455906600000 and timestamp <= 1456770599000 group by timestamp div 86400000;

2016-02-20 的第一个查询返回 1440。2016-02-20 的第二个查询返回 2016-02-20 00:00:00 = 330 和 2016-02-20 05:30:00 的 2 条记录= 1440。

【问题讨论】:

  • 显示您的数据和查询。
  • @Barmar 该帖子已更新数据和查询。谢谢。
  • 除以86400000和DATE(FROM_UNIXTIME(timestamp/1000))一样
  • 我无法重现您的结果:sqlfiddle.com/#!9/31375/5
  • GROUP BY DIV 也给了我奇怪的结果

标签: mysql sql group-by


【解决方案1】:

重复是因为您的服务器的时区与 UTC 不同。 Unix 时间戳基于 UTC 时间,因此 timestamp DIV 86400000 按 UTC 日期分组。但FROM_UNIXTIME() 将返回数据库时区中的时间。由于您选择FROM_UNIXTIME(timestamp/1000),因此您选择了组中的任意行,并且服务器时区中的日期可能与其UTC日期不同。因此,两个不同的 UTC 日期组将显示相同的时间戳日期。

您应该做的是选择 UTC 中的日期,因此您显示的日期与您分组所依据的日期相同。

SELECT FROM_UNIXTIME((TIMESTAMP DIV 86400000) * 86400), COUNT(*)
FROM testdata
WHERE timestamp BETWEEN 1455906600000 and 1456770599000
GROUP BY TIMESTAMP DIV 86400000

【讨论】:

  • 还有一个问题,两个查询的最后一条记录的值都不正确。似乎使用 DIV 分组间隔是不正确的方法?
  • 没关系,我可以通过在 UTC 和服务器时间之间添加时间戳来修复它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-06
  • 1970-01-01
  • 2012-09-29
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
  • 2015-07-14
相关资源
最近更新 更多