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

时间:2008-09-17 03:51:32

标签: sql excel charts group-by

我有一个时间表条目列表,显示开始和停止时间。这位于MySQL数据库中。我需要根据这些数据创建条形图,沿着底部24小时,以及每天每小时工作的工时量。

例如,如果Alice从15:30到19:30工作,Bob工作时间为12:15到17:00,那么图表将如下所示:

Example Chart

我现在有一个WTFey解决方案,涉及到电子表格走到列DY或类似的东西。所需的分辨率为15分钟。

我假设这是在数据库中最好的,然后导出用于图表创建。如果我遗漏任何细节,请告诉我。感谢。

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

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分钟。

答案 2 :(得分:0)

这是来自不同角度的另一种伪代码解决方案;更加密集,因为它每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)

答案 3 :(得分:0)

这个怎么样:

使用“时间”表,但有两列,包含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

看起来正确......