2013-01-11 71 views
1

我需要做一個報告。該報告跟蹤用戶點擊終端的時間,這些點擊被存儲在數據庫中的兩個表格上。我需要找到一個優雅的解決方案來循環使用日期範圍,併爲每天的每個小時執行一次報告。從24小時制的每小時日期範圍中選擇日期

我堅持最好和最優雅的方式來循環播放幾小時(即使沒有記錄那個小時的點擊,報告將顯示從00:00到23:00的小時)。

所以我的輸出必須是(作爲一個例子)

00:00 - 34 clicks 
01:00 - 22 clicks 
02:00 - 91 clicks 
03:00 - 4 Clicks 
... 
... 
23:00 - 17 Clicks 

我想在PHP $ startHour = 00:00聲明2個變量; $ endHour = $ startHour + 01:00;

並做一個循環遞增$ startHour unitl它匹配結束小時,但我不知道是否可以像這樣增加小時變量。

的日期的存儲格式爲:2012年11月22日9點17分29秒

這裏是我的MySQL查詢:

SELECT tbl_xboxstats.sessionend_date, 
     tbl_xboxstatsaux.XboxStatsId, 
     tbl_xboxstatsaux.ItemId, 
     tbl_xboxstats.UnitId, 
     tbl_xboxstats.UIId, 
     WEEK(tbl_xboxstats.sessionend_date) AS WeekNumber, 
     Count(tbl_xboxstatsaux.ItemId) AS Count 
FROM tbl_xboxstats 
INNER JOIN tbl_xboxstatsaux ON tbl_xboxstats.id = tbl_xboxstatsaux.XboxStatsId 
WHERE tbl_xboxstats.sessionend_date 
BETWEEN '2012-11-22 "' . $startHour . '"' 
AND '2012-11-22"' . $endHour . '"' 
GROUP BY tbl_xboxstatsaux.XboxStatsId 
LIMIT 0 , 30 
+0

我認爲最安全的方式,可能是你的起始日期轉換爲時間戳,加上3600到它(1小時),然後再改它變成日期格式。 – monkeymatrix

+0

Yout表結構/模式是什麼? – shadyyx

+0

@monkeymatrix這是一個可能的解決方案。也許你應該把它作爲答案?在此期間,我會放棄它。 – user1882752

回答

0

我認爲最安全的方式,可能是你的起始日期轉換爲時間戳,加3600吧(1小時),然後將其重新轉換爲日期格式。

或者你可能想的strtotime使用添加一個小時:

$starttime = "01:00"; 

$endtime = strtotime($starttime, "+1 hour") 
+0

是的,這是我最接近我需要的地方。很簡單,但我忽略了它。我需要更多咖啡...... – user1882752

0

我沒有得到這兩個表是如何相關(你說的輸出必須小時+點擊,但查詢選擇很多領域),但如果你想顯示的小時分組的點擊嘗試類似:

SELECT EXTRACT(HOUR FROM sessionend_date) AS hour, COUNT(*) 
    FROM your_table 
WHERE DATE(sessionend_date) = '2012-11-22' 
GROUP BY hour; 
+0

查詢按原樣拉取正確的記錄。這只是增量的格式和循環記錄我不確定的最佳方式,我可以想辦法做到這一點,但它們很笨拙我覺得 – user1882752

0

這將集團所有結果由小時。

SELECT tbl_xboxstats.sessionend_date, 
     tbl_xboxstatsaux.XboxStatsId, 
     tbl_xboxstatsaux.ItemId, 
     tbl_xboxstats.UnitId, 
     tbl_xboxstats.UIId, 
     WEEK(tbl_xboxstats.sessionend_date) AS WeekNumber, 
     HOUR(tbl_xboxstats.sessionend_date) AS Hours 
     Count(tbl_xboxstatsaux.ItemId) AS Count 
FROM tbl_xboxstats 
INNER JOIN tbl_xboxstatsaux ON tbl_xboxstats.id = tbl_xboxstatsaux.XboxStatsId 
WHERE tbl_xboxstats.sessionend_date 
BETWEEN '2012-11-22 "' . $startHour . '" 
AND '2012-11-22"' . $endHour . '" 
GROUP BY Hours 
LIMIT 0 , 30 
+0

謝謝Piontek,我不能檢查這是否正確,因爲我正在滾動此錯誤:#1305 - 功能touchitcms_xboxwin8.HOURS不存在我正在檢查數據庫的現在看看有什麼。 – user1882752

+0

Woops對不起,應該是HOUR(tbl_xboxstats.sessionend_date)AS小時,我不小心加了,S給它。 – Kyle

0

創建一個包含值0 - 23的表格。然後做一個LEFT JOIN其次是GROUP BY

SELECT hourlist.id AS HourOfDay, COUNT(1) 
FROM hourlist 
LEFT JOIN tbl_xboxstats ON hourlist.id = HOUR(tbl_xboxstats.sessionend_date) 
GROUP BY hourlist.id 

示例輸出虛擬數據:

HourOfDay COUNT(1) 
0   2087 
1   2038 
2   2158 
3   2053 
4   2143 
5   2054 
6   2110 
7   2035 
8   2048 
9   2070 
10   4239 
11   0 
12   0 
13   4280 
14   2033 
15   2104 
16   2085 
17   2120 
18   1978 
19   2039 
20   2077 
21   1990 
22   2159 
23   2100