我有一个显示开始和停止时间的时间表条目列表。它位于 MySQL 数据库中。我需要根据这些数据创建条形图,底部是一天中的 24 小时,以及一天中每个小时的工时。
例如,如果 Alice 从 15:30 到 19:30 工作而 Bob 从 12:15 到 17:00 工作,则图表将如下所示:
我现在有一个 WTFey 解决方案,其中涉及到 DY 列或类似的电子表格。所需的分辨率是 15 分钟间隔。
我假设这是最好在数据库中完成的事情,然后导出以创建图表。如果我遗漏任何细节,请告诉我。谢谢。
创建一个表,其中包含从午夜到午夜的时间,其中包含一天中的每一分钟。在数据仓库世界中,我们称之为时间维度。这是一个例子:
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
然后您所要做的就是将您的表加入时间维度,然后按 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
我想出了一个伪代码解决方案,希望它有所帮助。
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 分钟。
这是另一个不同角度的伪代码解决方案;更密集一点,因为它每 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
看起来对...