2010-05-06 122 views
5

我試圖列出過去24小時插入數據庫的每小時記錄數。每行顯示當天插入的記錄,以及多少小時前的記錄。MySQL:按小時插入記錄,在過去24小時內

這裏是我的查詢現在:

SELECT COUNT(*), FLOOR(TIME_TO_SEC(TIMEDIFF(NOW(), time))/3600) 
FROM `records` 
WHERE time > DATE_SUB(NOW(), INTERVAL 24 HOUR) 
GROUP BY HOUR(time) 
ORDER BY time ASC 

現在它返回:

28 23 
62 23 
14 20 
1 4 
28 3 
19 1 

這表明在23小時前,兩行的時候,只顯示每小時。 我認爲這與使用NOW()有關,而不是在一小時的開始時間,我不確定如何獲得。

必須有一個更簡單的方法來做到這一點。

回答

4

如果通過HOUR(time)組合,那麼你應該用你的選擇表達HOUR(time),而不是time。例如:

SELECT HOUR(time), COUNT(*) 
FROM `records` 
WHERE time > DATE_SUB(NOW(), INTERVAL 24 HOUR) 
GROUP BY HOUR(time) 
ORDER BY HOUR(time) 

或者,你可以要返回表達式組:

SELECT COUNT(*), FLOOR(TIME_TO_SEC(TIMEDIFF(NOW(), time))/3600) 
FROM `records` 
WHERE time > DATE_SUB(NOW(), INTERVAL 24 HOUR) 
GROUP BY FLOOR(TIME_TO_SEC(TIMEDIFF(NOW(), time))/3600) 
ORDER BY FLOOR(TIME_TO_SEC(TIMEDIFF(NOW(), time))/3600) 

如果你想知道,這是安全地調用NOW()多次這樣在相同的查詢。來自manual

返回當前日期或時間的函數在查詢執行開始時每個查詢僅評估一次。這意味着在單個查詢中對NOW()等函數的多次引用始終會產生相同的結果。