2016-02-26 26 views
0

我想組數據使用GROUP BY 1個區天間隔這個帖子上提到: Grouping into interval of 5 minutes within a time rangeMySQL的GROUP BY DIV結果並不一致

它看起來乍一看罰款。 但我發現在比較2個不同日期間隔(但相交)的查詢時出現不一致。 首先,我使用來自年2月1 00:00至02月26 00:00時間範圍,第二 我使用時間範圍從2月20日00:00至02月26 00:00

年02月20值是那些之間是不同的2個查詢。但其餘的(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 = 1440歸還2條記錄。

+1

顯示您的數據和查詢。 – Barmar

+0

@Barmar帖子已經更新了數據和查詢。謝謝。 – manus

+0

除以86400000與使用DATE(FROM_UNIXTIME(timestamp/1000))相同' – Barmar

回答

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 
+0

還有一個問題但是,兩個查詢的最後一條記錄都有不正確的值。看起來使用DIV的分組間隔時間不正確? – manus

+0

沒關係,我可以通過添加UTC和服務器時間之間的時間差的時間戳來修復它。 – manus