Elegant metode for å trekke hver time stolpediagram fra tidsintervalldata?

stemmer
3

Jeg har en liste over timeliste oppføringer som viser en start- og stopptidspunkt. Dette sitter i en MySQL database. Jeg må lage søylediagrammer basert på disse dataene med 24 timer av dagen langs bunnen og mengden av timeverk arbeidet for hver time på dagen.

For eksempel, hvis Alice jobbet en jobb 15:30 til 19:30 og Bob jobbet 12:15 til 17:00, vil diagrammet se slik ut:

eksempel

Jeg har en WTFey løsning akkurat nå som innebærer et regneark går ut til kolonne DY eller noe sånt. Den nødvendige oppløsningen er 15-minutters intervaller.

Jeg antar at dette er noe gjøres best i databasen deretter eksporteres for diagrammet skapelse. La meg vite om jeg mangler noen detaljer. Takk.

Publisert på 17/09/2008 klokken 01:51
kilden bruker
På andre språk...                            


4 svar

stemmer
0

Jeg kom opp med en pseudo løsning, håper det hjelper.

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

Nå timeplanen rekke holder verdiene du ønsker i 15 minutters detaljnivå, altså. en verdi på 4 = 1 time, 5 = 1 time og 15 minutter, 14 = 3 timer 30 minutter.

Svarte 17/09/2008 kl. 02:54
kilden bruker

stemmer
2

Lag en tabell med bare tid på det fra midnatt til midnatt inneholder hvert minutt av dagen. I datavarehus verden ville vi kalle dette en tidsdimensjon. Her er et eksempel:

TIME_DIM
 -id
 -time_of_day
 -interval_15 
 -interval_30

et eksempel på dataene i tabellen vil bli

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

Så alt du trenger å gjøre er å bli bordet ditt til tidsdimensjonen og deretter gruppen av interval_15. For eksempel:

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
Svarte 17/09/2008 kl. 02:55
kilden bruker

stemmer
0

Her er en annen pseudo løsning fra en annen vinkel; litt mer intensiv fordi den gjør 96 spørringer for hver 24-timers periode:

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)
Svarte 17/09/2008 kl. 03:00
kilden bruker

stemmer
0

Hva med dette:

Bruk at "tiden" tabellen, men med to kolonner, som inneholder 15-minutters intervaller. De from_times er 15-minutt ganger, to_times er et sekund før de neste from_times. For eksempel 12:30:00-12:44:59.

Nå får personen din arbeidsbordet, som jeg har kalt "aktivitet" her, med START_TIME og END_TIME kolonner.

Jeg har lagt verdier for Alice og Bob henhold til den opprinnelige spørsmålet.

Her er spørring fra 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)

som gir meg dette:

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

Ser omtrent riktig ...

Svarte 17/09/2008 kl. 08:06
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more