MySQL GROUP BY DIV结果不一致

时间:2016-02-26 22:56:34

标签: mysql sql group-by

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

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

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

知道发生了什么事吗?如何解决?

更新的 以下是每分钟2月生成虚拟数据的存储过程:

    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的第二次查询返回2记录2016-02-20 00:00:00 = 330和2016-02-20 05:30:00 = 1440。

1 个答案:

答案 0 :(得分: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