[db/sql/php] rooster: overlappende inschrijvingen berekenen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • 2
  • Registratie: November 2000
  • Laatst online: 26-05-2021
Ik zit met een probleem waar ik niet helemaal uitkom.

Wat ik wil bereiken is een webapplicatie d.m.v php en mysql waarin een aantal vaste users aan kan geven in een rooster welke uren van welke dagen ze beschikbaar zijn. Vervolgens wil ik als de laatste user zich heeft ingeschreven kunnen berekenen welke tijden alle users beschikbaar zijn, eventueel met een minimum aantal van uren die overlappen.

Ter verduidelijking - een toepassing zou bijvoorbeeld een groep mensen die een vergadering moeten plannen ergens in de week, en die vergadering moet minimaal 2 uur duren. Iedereen logt in en geeft op wanneer hij kan, en het systeem geeft aan welke mogelijke dagen/tijdstippen er zijn.

Waar ik niet uitkom is hoe ik de gegevens precies in de database op moet slaan opdat ik efficient de overlappende tijdstippen uit kan rekenen. Een oplossing die ik had bedacht was dat ik een tabel kan maken met bijvoorbeeld een kolom voor ieder uur van de dag, en dan als index voor de rij de datum. De waarde in iedere kolom zou dan een 1 van beschikbaar of een 0 van niet beschikbaar zijn.

Echter sla ik natuurlijk liever alleen de begin- en eindtijd van de intervallen op waarbinnen een user tijd heeft, en reken aan de hand daarvan uit wanneer iedereen kan. Dit omdat zo de database een stuk kleiner wordt, en ik eigenlijk ook niet alleen op het uur de beschikbaar vast wil leggen, maar per kwartier (user is beschikbaar van 14.15 tot 18.30 bijvoorbeeld). Probleem hier is dat het me niet helemaal lukt om een manier te bedenken waarop ik dan de overlappingen kan berekenen. Ik kan wel iets bedenken dat de hoogste begintijd minimaal 2 uur moet verschillen met de laagste eindtijd, maar het moet natuurlijk ook mogelijk zijn om meer dan 1 interval per dag aan te geven (user kan van 9 tot 11 en van 16 tot 18).

Heeft wellicht iemand een idee wat een handige manier zou zijn om dit aan te pakken?

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Je kunt, volgens mij, volstaan met simpelweg een begin en eindtijd opslaan per evenement.

Zie mijn uitleg hier hoe je dan kan checken op overlap:
[rml]ACM in "[ SQL] Sticky items"[/rml]
Humm, mijn uitleg was wel in een andere context, die van het "dubbelboeken". Waarschijnlijk kan je dit ook wel omdraaien, maar dan moet je als denk ik de overlap weglaten waarbij de te controleren waarden binnen de tijd zitten. Dus als een vergadering een uur duurt en iemand is in dat zelfde uur een half uur beschikbaar, dan gaat het mis, dan moet je dus niet "kleiner dan of gelijk aan" controleren, maar hooguit "gelijk aan".

[ Voor 48% gewijzigd door ACM op 13-03-2003 16:29 ]


Acties:
  • 0 Henk 'm!

  • 2
  • Registratie: November 2000
  • Laatst online: 26-05-2021
Dank je, je link helpt me op weg hoe ik het op kan delen in subproblemen.

In principe kan ik toch de test die jij doet op overlappen van twee intervallen, gewoon drie keer doen? Want iedere test op 2 intervallen creeert weer een nieuwe interval. Als ik intervallen A, B, C en D heb:

code:
1
2
3
test(A, B) = I
test(C, I) = II
test(D, II) = III


en III is dan wat ik nodig heb, toch? Misschien moet ik erbij vermelden dat de applicatie waarschijnlijk met niet veel meer dan 5 users te maken gaat krijgen.

--edit:
Moet dan ook wel checken of de intervallen groter of gelijk zijn aan het minimum (2 uur in mijn voorbeeld)

[ Voor 11% gewijzigd door 2 op 13-03-2003 16:43 ]


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Lijkt me dat je daar aardig ver mee kan komen ja :)

Pas alleen op dat je niet te veel checks doet, daar kan het erg traag van worden.
Maar het lijkt me verstandig dat je eerst probeert het correct te maken en daarna pas probeert het snel te maken :)