我正在尝试使用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。
答案 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