Elegante Methode zum Zeichnen von stündlichem Balkendiagramm von Zeitintervalldaten?
Frage
Ich habe eine Liste von Zeiterfassungseinträgen, die ein Start- und Stoppzeit zeigen. Dies wird in einer MySQL-Datenbank zu sitzen. Ich muss Balkendiagramme erstellen auf der Grundlage dieser Daten mit den 24 Stunden des Tages entlang des Bodens und der Menge an Mannstunden für jede Stunde des Tages gearbeitet.
Zum Beispiel, wenn Alice einen Job von 15.30 bis 19.30 Uhr und Bob arbeitete von 12.15 bis 17.00 Uhr gearbeitet, das Diagramm würde wie folgt aussehen:
Ich habe eine WTFey Lösung jetzt, dass eine Tabelle wie das Ausgehen zu Spalte DY oder etwas beinhaltet. Die benötigte Auflösung von 15-Minuten-Takt.
ich dies unter der Annahme, ist etwas, am besten in der Datenbank erfolgt dann für die Erstellung von Diagrammen exportiert. Lassen Sie mich wissen, ob ich irgendwelche Details bin fehlt. Danke.
Lösung
Erstellen Sie eine Tabelle mit nur Zeit in es von Mitternacht bis Mitternacht jede Minute des Tages enthält. In der Data Warehouse-Welt würden wir nennen dies eine Zeitdimension. Hier ein Beispiel:
TIME_DIM
-id
-time_of_day
-interval_15
-interval_30
ein Beispiel für die Daten in der Tabelle sei
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
Dann alles, was Sie tun müssen, ist Ihre Tabelle der Zeitdimension zu verbinden und dann die Gruppe von interval_15. Zum Beispiel:
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
Andere Tipps
ich mit einer Pseudo-Code-Lösung kam, hoffen, dass es hilft.
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
Nun ist der Zeitplan-Array enthält die Werte, die Sie in 15 Minuten Granularität wünschen, das heißt. ein Wert von 4 = 1 Stunde, 5 = 1 Stunde 15 Minuten, 14 = 3 Stunden und 30 Minuten.
Hier ist eine andere Pseudo-Code-Lösung aus einem anderen Winkel; ein bisschen intensiver, weil es tut 96 Abfragen für jeden 24-Stunden-Zeitraum:
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)
Wie wäre es damit:
Verwenden Sie das „mal“ Tisch, aber mit zwei Säulen, die 15-Minuten-Takt enthält. Die from_times sind die 15-mal minutely sind die to_times eine Sekunde vor dem nächsten from_times. Zum Beispiel 12.30.00 bis 12.44.59.
Jetzt ist Ihre Person Arbeitstisch bekommen, die ich „Aktivität“ genannt habe hier mit START_TIME und end_time Spalten.
Ich habe Wert für Alice und Bob nach der ursprünglichen Frage.
Hier ist die Abfrage von 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)
das gibt mir diese:
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
Sieht ungefähr richtig ...