2008-09-17 19 views
3

У меня есть список записей расписания, которые показывают время начала и окончания. Это сидит в базе данных MySQL. Мне нужно создать гистограммы, основанные на этих данных, с 24 часами дня по дну и количеством человеко-часов, работающих в течение каждого часа дня.Элегантный метод для составления почасовой гистограммы по данным временного интервала?

Например, если Алиса работала на работу с 15:30 до 19:30 и Боб работал с 12:15 до 17:00, график будет выглядеть следующим образом:

Example Excel Chart http://i35.tinypic.com/rbk6ee.png

У меня есть решение WTFey прямо сейчас, которое включает таблицу, выходящую в колонку DY или что-то в этом роде. Необходимое разрешение - 15-минутные интервалы.

Я предполагаю, что это то, что лучше всего сделано в базе данных, а затем экспортировано для создания диаграммы. Дайте мне знать, если мне не хватает деталей. Благодарю.

ответ

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 
+0

не должны присоединиться к вашей выглядеть следующим образом: INNER JOIN time_dim b ON (a.start_time <= b.time AND a.end_time> = b.время) И вы хотели бы разделить значение count (*) на 15, чтобы получить «человеко-четверть часа» (т. е. сколько целых мужчин за 15-минутный период). Если бы вы искали человеко-часы, вы разделили бы на 60. – Prestaul 2008-09-17 05:15:40

+0

Вместе вы с Майком ответили. Спасибо! – willpall 2008-09-17 07:07:46

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 минут.

0

Вот еще одно решение псевдокода под другим углом; немного более интенсивным, поскольку он делает 96 запросов для каждого 24hr период:

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) 
0

Как об этом:

Используйте этот «раз» таблицы, но с двумя столбцами, содержащими 15-минутными интервалами. Время от времени составляет 15 минут, to_times - секунда до следующего from_times. Например, с 12:30 до 12:44:59.

Теперь получите свой рабочий стол, который я назвал здесь «активностью», с столбцами start_time и end_time.

Я добавил значения для Алисы и Боба в соответствии с исходным вопросом.

Вот запрос из 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 

выглядит правильно ...