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.

War es hilfreich?

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 ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top