2013-01-11 73 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