Terminvergabe überprüfen

Tjorven

Grünschnabel
Hallo zusammen,

ich habe folgendes Problem:
Ich bin gerade dabei eine Raumverwaltung zu programmieren (MSSQL und PHP).
Jetzt ist folgendes problem aufgetreten.
Mit folgender SQL Anweißung will ich überprüfen ob ein Raum zu dieser Zeit schon vergeben ist.

PHP:
IF EXISTS(SELECT Termin_ID FROM Termin WHERE 
Datum = '23.08.2004' 
AND
Raum_ID = 12 
AND 
('$_POST[Uhrzeit_beginn]' between Uhrzeit_beginn AND Uhrzeit_ende) 
OR
('$_POST[Uhrzeit_ende]' between Uhrzeit_beginn AND Uhrzeit_ende))
PRINT 'Termin breits vergeben'
ELSE 
Insert Into

Diese Funktion funktioniert leider nur bedingt.
Beispiel:
Es liegt ein Termin für diesen Raum und dieses Datum zur Uhrzeit 12:00 - 13:00 Uhr an.

Wird jetzt ein Termin angelegt der von 11:45 - 13:30Uhr liegen soll sind beide Zeiten außerhalb
von 12:00 - 13:00 Uhr. Somit wird der Termin angelegt obwohl der Raum bereits belegt ist.

Hat jemand eine Lösung die funktioniert? Ich komme einfach nicht weiter.
Vielen Dank
 
Hallo,

Geht es vielleicht damit?
PHP:
IF EXISTS(SELECT Termin_ID FROM Termin WHERE 
Datum = '23.08.2004' 
AND 
Raum_ID = 12 
AND 
('$_POST[Uhrzeit_beginn]' between Uhrzeit_beginn AND Uhrzeit_ende) 
OR 
('$_POST[Uhrzeit_ende]' between Uhrzeit_beginn AND Uhrzeit_ende)
OR
('$_POST[Uhrzeit_beginn]' <= Uhrzeit_beginn AND '$_POST[Uhrzeit_ende]' >= Uhrzeit_ende)) 
PRINT 'Termin breits vergeben' 
ELSE 
Insert Into
 
so sollte man eine Überschneidung finden:

SELECT Termin_ID FROM Termin WHERE
Datum = '23.08.2004'
AND
Raum_ID = 12
AND (('$_POST[Uhrzeit_beginn]' < Uhrzeit_ende) OR
('$_POST[Uhrzeit_ende]' > Uhrzeit_beginn ))
 
Fast richtig, melmager :-)

SELECT Termin_ID FROM Termin WHERE
Datum = '23.08.2004'
AND
Raum_ID = 12
AND (('$_POST[Uhrzeit_beginn]' < Uhrzeit_ende) AND
('$_POST[Uhrzeit_ende]' > Uhrzeit_beginn ))
 
@Gorcky OR war schon richtig

Wenn der Neue Termin vor dem Ende des eingetragenen ODER
das Ende des Neuem Termins hinter dem Anfang des eingetragenen
Termins ist, dann ist eine Überschneidung vorhanden.

wenn der Select also ein Datensatz liefert, dann eine Fehlemeldung bringen
ansonsten kann der Termin eingtragen werden
 
Zuletzt bearbeitet:
@melmager
Ich weiß, ich habe damals auch ganz schön lange dran gegrübelt, als ich das mal brauchte - aber deine Situation würde jetzt für folgende Fälle ein Datum zurückgeben:

Code:
termin1 
           termin2
------------------------------------------------------------------------
           termin1 
termin2
------------------------------------------------------------------------
termin1 
  termin2
------------------------------------------------------------------------
t  e  r  m  i  n  1 
     termin2
------------------------------------------------------------------------
  termin1 
termin2
------------------------------------------------------------------------
   termin1 
t e r m i n 2
------------------------------------------------------------------------
Das wären somit alle Fälle - einschließlich der beiden oberen, erlaubten Fälle.
Das kommt daher, weil bei diesen beiden ebenfalls erfüllt ist, dass das Startdatum eines der Termine kleiner ist, als das Enddatum des anderen.
Aber nur, wenn dies für die Startdaten beider Termine der Fall ist, überschneiden sie sich.

Sollte ich mich irren, habe ich wohl in meinem letzten Projekt ganz große Sch*** gebaut... :eek:


PS: Bleibt immer noch die Streitfrage, ob Termine sich nicht auch schon überschneiden, wenn der zum selben Zeitpunkt aufhört, wie der andere anfängt, aber das ist eine Kleinigkeit und Theorethikerfrage, ob man jetzt bei beiden Vergleichen ein = hinzufügt, oder nicht...:p
 
Zuletzt bearbeitet:
Jupp hast recht Gorcky

aus ODER wird UND wenn man die Abfrage umkehrt

Nächtesmal muss ich länger nachdenken :-)
 
Zurück