2010-04-05 51 views
17

如何根據時間單位的時間單位時間的任意時間戳列來計算MySQL表中的記錄數?將MySQL數據分組爲任意大小的時間段

具體來說,我想要統計在給定時間間隔內有多少記錄的時間戳落入15分鐘桶中。我明白如何用1秒,1分,1小時,1天等桶使用MySQL日期函數,例如

SELECT YEAR(datefield) Y, MONTH(datefield) M, DAY(datefield) D, COUNT(*) Cnt FROM mytable GROUP BY YEAR(datefield), MONTH(datefield), DAY(datefield) 

但是我怎樣才能按15分鐘桶分組?

回答

21
GROUP BY 
    YEAR(datefield), 
    MONTH(datefield), 
    DAY(datefield), 
    HOUR(datefield), 
    FLOOR(MINUTE(datefield)/15) 

你可以替代地說只是:

SELECT FLOOR(UNIX_TIMESTAMP(datefield)/900) AS t, COUNT(*) AS cnt 
FROM mytable 
GROUP BY t 

與負責格式化,每次15分鐘的時間內的時間戳回給可讀Y/M/d/H/M的應用。 (如果你需要有本地時間在一個瘋狂的非​​刻鐘對齊時區,你需要一個黑客雖然偏移。)

4

如何獲得(HOUR(DateField)* 60 + MINUTES(DateField))/ YourInterval的INTEGER。

這樣,無論您的間隔時間如何,包括小時* 60分鐘都會在給定的一天中保持順序,並且您不會每小時處理15分鐘,但每15分鐘的自己的時間小時......將該列添加到您的group by子句中,您可以通過它的序號位置來執行此操作。

3

只是爲了讓你思考,這裏的FLOOR(MINUTE(datefield)/15)解決方案的替代方案:

GROUP BY CASE 
WHEN MINUTES(datetime) BETWEEN 0 AND 14 THEN 0 
WHEN MINUTES(datetime) BETWEEN 15 AND 29 THEN 1 
WHEN MINUTES(datetime) BETWEEN 30 AND 44 THEN 2 
WHEN MINUTES(datetime) BETWEEN 45 AND 59 THEN 3 
END 
+0

@Marcus:結果與使用FLOOR有什麼不同? – 2010-04-05 20:05:49

+1

@Eric J.,結果是一樣的。只是另一種方式來做到這一點。 – 2010-04-05 20:14:51

+0

我有一堆unixtime整數。使用這個我可以在代碼中設置「時間段」(月份間隔,所以不是所有的時間間隔都是相等的)。 – Martijn 2012-10-11 06:59:14

相關問題