[php/MySQl]Agenda functie, dubbele afspraak checken

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Jochemmol
  • Registratie: Augustus 2004
  • Laatst online: 07-05-2014
Ik ben bezig met het maken van een online agenda. Ik heb in de databases voor de tijden rwee velden aangemaakt. "Begin_tijd" en "Eind_tijd".

Het invoegen en uitlezen van de afspraken gaat goed. Maar ik wil dat als er een nieuwe afspraak wordt gemaakt dat er gecontrollerd wordt of er geen dubbele afspraak word gemaakt. ik heb nu deze Query:
code:
1
2
$Query = mysql_query("Select * FROM tbagenda WHERE tbagenda.Datum = '$datum' AND
tbagenda.Eind_tijd BETWEEN '$Begin_tijd' AND '$Eind_tijd' ");

Als nu in de database in het veld "Eind_tijd" een waarde staat die valt tussen de ingevoerde "begin_tijd" en "Eind_tijd" betekend dat er een afspraak is op dat moment. Opzich werkt dat.

Maar als ik een afspraak heb van 10:00 tot 12:00 en plan nog een afspraak vam 11:00 tot 11:30 dan valt er geen eind_tijd(12:00) tussen de ingevoerde waarde maar plan ik wel een dubbelle afspraak. |:(

Hoe kan ik dit oplossen?

Jochemmol


Acties:
  • 0 Henk 'm!

  • MeIsTwisted
  • Registratie: November 2001
  • Laatst online: 28-07-2023

MeIsTwisted

not a Twisted mind

Dit moet je omzetten in sql

Als de begintijd van nieuwe afspraak later is dan begintijd bestaande en vroeger is dan eindtijd bestaande afspraak dan is dubbel.
of als:
eindtijd nieuwe afspraak later is dan begintijd bestaande afspraak.

nog paar opties vergeten geloof ik, maar iig een id om verder te helpen hoop ik

[ Voor 15% gewijzigd door MeIsTwisted op 27-06-2005 12:11 ]

Multimonitor is relax :P


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Bepaal eerst de 4 mogelijkheden van een overlappende afspraak en bepaal aan de hand daarvan welke checks je uit moet voeren om te kijken dat je niet dubbel aan het boeken bent.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Wiskundige formules gebruiken (na jah...wiskundig, rekenkundig):

code:
1
2
3
4
5
mogelijkheid 1: begin voor start eind voor start, actie: goed
mogelijkheid 2: begin voor start eind voor stop, actie: fout
mogelijkheid 3: begin na start eind voor stop, actie: fout
mogelijkheid 4: begin na start eind na stop, actie: fout
mogelijkheid 5: begin na stop eind na stop, actie: goed

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

@ blaatkoetje:
Je mist er 1. Daarnaast gelden enkelen dubbel. 2 geldt bv ook waanner 1 geldt. Je zult daar een extra "eind na start" op moeten nemen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

2Janoz,

jah klopt, je bedoelt een complete overlapping, ik heb ooit zoiets gemaakt voor een planningssysteem, maar moest ff graven

[ Voor 5% gewijzigd door Verwijderd op 27-06-2005 12:40 ]


Acties:
  • 0 Henk 'm!

  • Jochemmol
  • Registratie: Augustus 2004
  • Laatst online: 07-05-2014
Deze mogelijk hede zijn er dus:

- Begintijd voor de begintijd van al een bestaande afspraak maar afgelopen voor de eindtijd van een bestaande afspraak.
- Begintijd tegelijk met de begintijd van een bestaande afspraak.
- Begin en eindtijd binnen een bestaande afspraak.
- begin en eindtijd voor en na een bestaande afspraak (overlapping)
- begint na een ingestelde begintijd en eindigd na de de eindtijd van een bestaande afspraak

Mijn query vangt punt 1 af.

punt 2 is ook gemakkelijk af te vangen. Maar hoe kan ik de andere afvangen.

Het probleem is dat ik niet weet en ook niet kan vinden hoe ik een ingevoerde waarde kan controleren of hij valt binnen een range in de database want dit kan niet. |:(
code:
1
2
$Query = mysql_query("Select * FROM tbagenda WHERE Datum = '$datum' 
AND '$Begin_tijd' BETWEEN tbagenda.Begin_tijd  AND tbagenda.Eind_tijd");

Jochemmol


Acties:
  • 0 Henk 'm!

  • jochemd
  • Registratie: November 2000
  • Laatst online: 24-08 12:31
In SQL zou dit heel makkelijk zijn:
code:
1
2
3
Select *
FROM tbagenda
WHERE (start, eind) OVERLAPS ($Begin_tijd, $Eind_tijd)
Maar ja, in MySQL werkt dat natuurlijk weer niet :(


De logica van een OVERLAPS predicaat is overigens vrij eenvoudig. Als je een interval i1 hebt dat loopt van start1 tot stop1 en een interval i2 dat loopt van start2 tot stop2, dan overlappen die intervallen als er een moment X bestaat dat ligt in zowel i1 als in i2. Of om dat in een paar vergelijkingen uit te drukken:
start1 < X < stop1 ^ start2 < X < stop2

Dit reduceert tot:
start2 < stop1 ^ start1 < stop2

Afhankelijk van je definitie van overlappen moet je misschien =< gebruiken in plaats van <.

Acties:
  • 0 Henk 'm!

  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 18-08 21:31
Er zijn maar twee voorwaarden die beide voldaan moeten zijn voordat een afspraak overlapt.
De begintijd moet voor de eindtijd van andere afspraken zijn en de eindtijd moet na de begintijd van andere afspraken zijn.

Acties:
  • 0 Henk 'm!

  • Jochemmol
  • Registratie: Augustus 2004
  • Laatst online: 07-05-2014
Ik denk dat het opgelost is.

Als een afspraak begint voor een andere afspraak en eindigt na een andere afspraak (overlaping)
code:
1
2
$Query = mysql_query("Select * FROM tbagenda WHERE Datum = '$datum' 
AND tbagenda.Begin_tijd >= '$Begin_tijd' AND tbagenda.Eind_tijd <= '$Eind_tijd' ");

De tbagenda.begintijd is gelijk of groter dan de dan de nieuwe tijd en de tbagenda.eindtijd is kleiner of gelijk aan de nieuwe tijd. Als dit het geval is wordt er een andere afspraak overlapt.

Als de afspraak binnen een andere afspraak valt:
code:
1
2
$Query = mysql_query("Select * FROM tbagenda WHERE Datum = '$datum' AND
tbagenda.Begin_tijd <= '$Begin_tijd' AND tbagenda.Eind_tijd >= '$Eind_tijd' ");

tbagenda.Begin_tijd is dan kleiner dan de nieuwe tijd en de tbagenda.Eind_tijd is groter of gelijk

Als de begintijd valt in een geplande afspraak
code:
1
2
$Query = mysql_query("Select * FROM tbagenda WHERE Datum = '$datum' AND 
tbagenda.Eind_tijd BETWEEN '$Begin_tijd' AND '$Eind_tijd'");

De tbagenda.Eind_tijd valt tussen de begin en eindtijd van de nieuwe afspraak

Als de nieuwe afspraak eindigt in een bestaande afspraak.
code:
1
2
$Query = mysql_query("Select * FROM tbagenda WHERE Datum = '$datum' AND 
tbagenda.Begin_tijd BETWEEN '$Begin_tijd' AND '$Eind_tijd'");

De tbagenda.Begin_tijd = groter dan de nieuwe begin_tijd en de eind_tijd is groter dan de nieuwe eind_tijd.

Volgens mij werkt alles zo. Maar als iemand commetaar heeft of verbeteringen hoor ik het graag. Bedankt allemaal

[ Voor 9% gewijzigd door Jochemmol op 27-06-2005 15:50 ]

Jochemmol


Acties:
  • 0 Henk 'm!

Verwijderd

Dit probleem is eenvoudiger te doorgronden door uit te gaan van het tegengestelde: wanneer overlappen twee afspraken NIET? Afspraak 1 overlapt afspraak 2 niet, als:

1. afspraak 1 in zijn geheel voor afspraak 2 ligt, dus als eindtijd afspraak 1 < begintijd afspraak 2

of

2. afspraak 1 in zijn geheel na afspraak 2 ligt, dus als begintijd afspraak 1 > eindtijd afspraak 2

In alle andere gevallen is er sprake van overlap.

Where-clause om alle afspraken te vinden waarmee GEEN overlap is, wordt dan:

code:
1
2
WHERE afspraak1.eindtijd < afspraak2.begintijd
OR afspraak1.begintijd > afspraak2.eindtijd


Where-clause om alle afspraken te vinden waarmee WEL overlap is, wordt:

code:
1
2
WHERE NOT(afspraak1.eindtijd < afspraak2.begintijd
OR afspraak1.begintijd > afspraak2.eindtijd)


oftewel, via wat logische bewerkingen:

code:
1
2
WHERE afspraak1.eindtijd >= afspraak2.begintijd
AND afspraak1.begintijd <= afspraak2.eindtijd)

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op maandag 27 juni 2005 @ 15:50:
Dit probleem is eenvoudiger te doorgronden door uit te gaan van het tegengestelde: wanneer overlappen twee afspraken NIET? Afspraak 1 overlapt afspraak 2 niet, als:

1. afspraak 1 in zijn geheel voor afspraak 2 ligt, dus als eindtijd afspraak 1 < begintijd afspraak 2

of

2. afspraak 1 in zijn geheel na afspraak 2 ligt, dus als begintijd afspraak 1 > eindtijd afspraak 2

In alle andere gevallen is er sprake van overlap.

Where-clause om alle afspraken te vinden waarmee GEEN overlap is, wordt dan:

code:
1
2
WHERE afspraak1.eindtijd < afspraak2.begintijd
OR afspraak1.begintijd > afspraak2.eindtijd


Where-clause om alle afspraken te vinden waarmee WEL overlap is, wordt:

code:
1
2
WHERE NOT(afspraak1.eindtijd < afspraak2.begintijd
OR afspraak1.begintijd > afspraak2.eindtijd)


oftewel, via wat logische bewerkingen:

code:
1
2
WHERE afspraak1.eindtijd >= afspraak2.begintijd
AND afspraak1.begintijd <= afspraak2.eindtijd)
Dat is precies wat je moet doen, maar moeten we hem dat oplepelen? (oeps modgedrag)

Acties:
  • 0 Henk 'm!

  • Jochemmol
  • Registratie: Augustus 2004
  • Laatst online: 07-05-2014
blaatkoetje je heb gelijk het hoeft niet opgelepeld te worden. Maar toen jochemd met een tip kwam had ik het zelf al uitgezocht(zie mijn topic). Het werkte perfect(test maar) Alleen ik had het wat omslachtig gedaan . Ik poste dat zodat als iemand anders ooit dit probleem tegen komt dan via GoT search een oplossing kan vinden.

Maar als iemand een beter oplossing had was dat welkom maar niet perse nodig want ik had het zelf al opgelost met tip van jochemd maar wel bedankt voor je "hulp" alleen jammer dat ik er niks aan heb gehad.

[ Voor 13% gewijzigd door Jochemmol op 27-06-2005 17:06 ]

Jochemmol

Pagina: 1