Problem mit Datum vergleichen
sim
- php
0 Bademeister0 sim0 Tom1 Bademeister
0 sim0 Tom
Hallo,
ich werde zurzeit von einem Problem fertigt gemacht... :( ich weiß nicht obs ein Logikfehler ist oder ich steh einfach nur aufm Schlauch.
Naja zum Problem:
Ich habe eine Datenbank mit Einträgen, einen Start und einen Endtimestamp, welche ich auslese und nun mit einer User eingabe vergleiche. Da habe ich auch einen Start und Endtimestamp. Es geht darum, dass sich der User keinen Termien auswählen darf, der schon in der Datenbank drinnen steht.Diese dürfen sich auch nicht überschneiden. Nun bekomme ich es aber nicht hin, es so zu vergleichen, dass es sogar Funktioniert :P.
Naja ich bedanke mich schonmal für Antworten.
Gruß
sim
Hi sim,
Nun bekomme ich es aber nicht hin, es so zu vergleichen, dass es sogar Funktioniert :P.
Bekommst Du es denn wenigstens hin, es so zu vergleichen, dass es nicht funktioniert? ;-)
Schreib doch mal bitte (hier) in einem vernuenftigen deutschen Satz hin, welche Kriterien die eingegebenen Daten erfuellen muessen, damit die Eingabe akzeptiert wird. Dann duerfte sich Dein Problem bereits in Luft aufgeloest haben.
Uebrigens: Wenn man
Problem mit Datum vergleichen
tut, duerfte false rauskommen. Oder nur ein Deppenleerzeichen?
Viele Gruesse,
der Bademeister
Wer Rechtschreib-/Grammatikfehler findet, darf sie behalten... Naja ich versuche sie zu vermeiden.
Also:
Im Projekt geht es um die Reservierung eines Objektes in einem bestimmten Zeitraum.
Ich habe eine Datenbank mit Start- und Endtimestamps. Dies sind die Termiene, an denen das Objekt bereit reserviert ist.
So jetzt kommt der Nutzer auf eine Seite, auf der er sich ein Zeitbereich auswählen kann. Wenn er bestätigt, soll überprüft werden ob in dem Zeitbereich, in dem der Nutzer das Objekt reservieren will, bereits eine Reservierung vorliegt. Dann sind wir aber auch schon bei meinem Problem. Ich schaffe es nicht, dies herrauszufinden. Ich erhoffe hier eine Anregung zu bekommen, bzw. wenn jemand einen guten Lösungsansatz hat, diesen zu Verstehen.
Gruß
Sim
Hello,
nimm den neuen Datensatz,
davon den Starttermin S
suche Datensätze in der Datenbank, deren Starttermin kleiner ist als S
und deren Endtermin größer sit als S
gibt es welche? Dann größten Endtermin davon feststellen
dieser wird der früheste Starttermin S werden können
davon den Endtermin E
suche Datensätze in der Datenbank, deren Starttermin kleiner ist als E
und deren Endtermin größer ist als E
gibt es welche? Dann kleinsten Starttermin davon feststellen
dieser wird der späteste Endtermin E werden können
|--------------| |----------------|
x--------------------x
S E
Das Ganze sieht aus, als sollte man dafür Stored Routines schreiben und als müsse man die Tabelle während der Inserts und Updates sperren gegen nebenläufige Prozesse.
Es wäre jedenfalls falsch, erst in einem Query abzufragen, ob es eine passende Lücke gibt, um dann im nächsten Query der Verbindung den Datensatz einzutragen. Da kann die Lücke schon durch ein Query einer anderen Verbindung verändert worden sein.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hi,
das Problem war schon im wesentlichen klar. Was ich meinte, ist:
Gegeben Start- und Endtermin der neuen Eingabe und Start- und Endtermin eines bereits bestehenden Eintrages, wie lautet die Bedingung, fuer die Du Dich interessierst? Und zwar ohne das Wort "ueberschneiden", nur mit den Terminen und den Begriffen "kleiner" und "groesser". Wenn Du das in einem deustchen Satz hinschreibst, hast Du Dein Problem geloest. Es ist naemlich (bisher) weder ein PHP- noch ein Datenbank-Problem, sondern lediglich das Problem, dass Du Dir nicht so genau klargemacht hast, was eigentlich Dein Problem ist.
@Tom: Achtung, mit Deinem Ansatz findest Du nicht
|--------------|
x--------------------x
S E
sowas.
Viele Gruesse,
der Bademeister
Hello,
@Tom: Achtung, mit Deinem Ansatz findest Du nicht
|--------------|
x--------------------x
S E
Danke. Wofür doch Bilder manchmal gut sein können.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
@Bademeister
"Es ist naemlich (bisher) weder ein PHP- noch ein Datenbank-Problem," Habe ich das irgendwo behauptet?
"wie lautet die Bedingung, fuer die Du Dich interessierst? Und zwar ohne das Wort "ueberschneiden", nur mit den Terminen und den Begriffen "kleiner" und "groesser"." Wenn du den Text richtigt liest, geht das sehr wohl aus ihm hervor!
Gruß
Sim
Hi,
bitte belasse die vorgegebenen Zitatzeichen, und ersetze sich nicht durch Anführungszeichen.
Es ist naemlich (bisher) weder ein PHP- noch ein Datenbank-Problem,
Habe ich das irgendwo behauptet?
Du hast zumindest den Themenbereich PHP gewählt.
wie lautet die Bedingung, fuer die Du Dich interessierst? Und zwar ohne das Wort "ueberschneiden", nur mit den Terminen und den Begriffen "kleiner" und "groesser".
Wenn du den Text richtigt liest, geht das sehr wohl aus ihm hervor!
Nein, daraus geht nur hervor, was du "willst".
Welche Gedanken du dir bisher selber gemacht hast, um das in mathematisch/logisch fassbare Bedingungen zu formulieren, aber nicht.
MfG ChrisB
Du hast zumindest den Themenbereich PHP gewählt.
Welchen hätte ich deiner Meinung nach wählen sollen.
Gruß
sim
Hi,
Habe ich das irgendwo behauptet?
Ja. Bei der Wahl des Themenbereiches.
Wenn du den Text richtigt liest, geht das sehr wohl aus ihm hervor!
Wenn es aus ihm hervorgeht, verstehe ich nicht, warum Du hier danach fragst.
Ein (angegebener) Termin mit Startzeit S_1 und Endzeit E_1 und ein (bereits vorhandener) Termin mit Startzeit S_2 und Endzeit E_2 ueberschneiden sich _nicht_, wenn
E_1 kleiner[1] als S_2
oder
S_1 groesser[1] als E_2
ist. Sie ueberschneiden sich, wenn obige Bedingung nicht erfuellt ist. Das musst Du beim Vergleich abfragen, und fertig ist der Lack.
Du hast nicht mal etwas gefragt im Ausgangsposting, sondern Dein Problem geschildert. Wenn man ein Problem hat, dann loest man es i.a. Und wenn man es nicht loesen kann, dann fragt man andere um Rat. Aber dann ist eine _konkrete Frage_, insbesondere also eine _Frage_, hilfreich. Du machst ein Posting mit dem Themenbereich PHP, in dem Du von Deiner Datenbank erzaehlst und sagst, dass Du einen Vergleich nicht hinbekommst. Da kann doch keiner wissen, ob Du Probleme mit der Logik, mit SQL oder mit PHP hast.
Also wenn Du jetzt Schwierigkeiten haben solltest, obiges konkret zu implementieren, dann frag hier gezielt nach, und ich, oder andere, helfen Dir gerne weiter.
[1] ggf. kleiner/gleich bzw. groesser/gleich - je nachdem, was man unter Start- und Endzeit versteht.
Viele Gruesse,
der Bademeister
Hmm,
Ich weiß ja nicht obs da noch immer unklarheiten gibt deshalb nochmal:
Es geht um 1 Objekt. Dieses kann für einen bestimmten Zeitraum reserviert werden. Dieses wird nun von Nutzer X reserviert. Also haben wir in der Datenbank den Start- und Endtimestamp.
Nun kann ein anderer Nutzer Y das Objekt auch reservieren. Dieser muss jedoch ebenfalls einen Startzeitpunkt und einen Endzeitpunkt angeben. Jetzt ist es ja mehr als Logisch das die Reservierung von Nutzer X und Nutzer Y sich nicht überlagern / überschneiden dürfen, da es dieses Objekt auch nur einmal gibt. So jetzt die Frage die du gefordert hast: Wie stelle ich die Bedingung, dass Nutzer Y eine Fehlermeldung bekommt wenn er das Objekt zu einem Zeitpunkt reservieren will, zudem es schon reserviert wurde.
so, dass Problem bei deinem Lösungsansatz liegt hier, falls ich mich nicht vertuhe:
S2 E2
|-----------|
x-----------x
S1 E1
Ausserdem bin ich mir bei Toms Lösung auch nicht so sicher, dass der folgende Fall funktioniert.
S2 E2
|-------|
x------------x
S1 S2
Gruß
Simfire
dass Problem bei deinem Lösungsansatz liegt hier, falls ich mich nicht vertuhe:
S2 E2
|-----------|
x-----------x
S1 E1
Sehe ich nicht so. Nochmal: Die Termine ueberschneiden sich genau dann NICHT, wenn
S2 E2
|-----------|
x-----------x
S1 E1
also E1 <(=) S2,
ODER
S2 E2
|-----------|
x-----------x
S1 E1
also E2 <(=) S1.
Vorausgesetzt natuerlich, dass die Zeiten schon als "sinnvoll" angenommen sind, d.h. S1 <= E1 und S2 <= E2 (bei Formulareingaben unbedingt pruefen!).
Sie ueberschneiden sich genau dann, wenn - klar - sie sich nicht "nicht ueberschneiden", also wenn obige Bedingung nicht erfuellt ist.
Oder?
Viele Gruesse,
der Bademeister
Vorausgesetzt natuerlich, dass die Zeiten schon als "sinnvoll" angenommen sind, d.h. S1 <= E1 und S2 <= E2 (bei Formulareingaben unbedingt pruefen!
Das wird als erstes überprüft :)
Noch ein wenig überlegen dann fang ich mal an und versuche umzusetzten. Mal schauen ob da noch Probleme kommen, aber danke für Antworten
Gruß
Sim
so, dass Problem bei deinem Lösungsansatz liegt hier, falls ich mich nicht vertuhe:
S2 E2
|-----------|
x-----------x
S1 E1
Schwubs... vertahn sry :D, endlich sind alle ausm Büro und ich kann mir endlich aufs Thema konzentrieren.
Gruß
Sim
Hi,
So jetzt die Frage die du gefordert hast: Wie stelle ich die Bedingung, dass Nutzer Y eine Fehlermeldung bekommt wenn er das Objekt zu einem Zeitpunkt reservieren will, zudem es schon reserviert wurde.
Schön, dass du die Frage wiederholst - und wo ist dein Versuch einer Beantwortung dieser?
so, dass Problem bei deinem Lösungsansatz liegt hier, falls ich mich nicht vertuhe:
S2 E2
|-----------|
x-----------x
S1 E1
Dann beschreibe, wo du ein Problem siehst. (Und damit meine ich jetzt nicht wieder einen Verweis auf dieses ASCII-Bildchen, sondern ein Beispieldatum nebst Erklärung, welche Bedingung darauf angewandt welches Ergebnis bringt.)
Ausserdem bin ich mir bei Toms Lösung auch nicht so sicher, dass der folgende Fall funktioniert.
Auch hier das gleiche.
MfG ChrisB
suche Datensätze in der Datenbank, deren Starttermin kleiner ist als S
und deren Endtermin größer sit als S
gibt es welche? Dann größten Endtermin davon feststellen
dieser wird der früheste Starttermin S werden können
Ist Lösung für einen Fall von Tom. Dieser sieht so aus:
S2 E2
|-----------|
x---------X
S1 E1
Dargestellt in Formel sollte es so ausseh:
S2 < S1 AND E2 >S1
So ich sehe das Problem hierdrinnen
Vom 19.06.2009 15:00 bis 20.06.2009 15:00 ist das Objekt bereit reserviert.
Ich will dieses nun ebenfalls vom 19.06.2009 15:00 und bis 22.06.2009 15:00 reservieren. Da bei oben genannter Bedingung nur überprüft wird ob S2 kleiner ist als S1 geht es nicht hin. Da S2 < S1 false ist. E2 > S1 ist zwar true, aber weil wir AND benutzen ist es false. Also Theoretisch nach dieser Bedingung drüfte ich Reservieren.
Gruß
sim
Hi,
Vom 19.06.2009 15:00 bis 20.06.2009 15:00 ist das Objekt bereit reserviert.
Ich will dieses nun ebenfalls vom 19.06.2009 15:00 und bis 22.06.2009 15:00 reservieren. Da bei oben genannter Bedingung nur überprüft wird ob S2 kleiner ist als S1 geht es nicht hin.
Dass noch zu überlegen ist, wo und wie Gleichheits-Fälle mit einzubeziehen sind, sprach bademeister schon an.
MfG ChrisB
Hello,
Ist Lösung für einen Fall von Tom. Dieser sieht so aus:
S2 E2
|-----------|
x---------X
S1 E1
Dargestellt in Formel sollte es so ausseh:
S2 < S1 AND E2 >S1
Es müssen vier Fälle geprüft werden:
S E
|-----------|
x---------x
Xs Xe
S E
|-----------|
x---------x
Xs Xe
S E
|-----------|
x--------------------x
Xs Xe
S E
|--------------------|
x------------x
Xs Xe
Xs liegt im Bereich eines anderen Termins -> nicht erlaubt
(Xs >= S && Xs <= E)
und
Xe liegt im Bereich eines anderen Termins -> nicht erlaubt
(Xe >= S && Xe <= E)
und
S liegt im Bereich von Xs bis Xe -> nicht erlaubt
(S >= Xs && S <= Xe)
und
E liegt im Bereich von Xs bis Xe -> nicht erlaubt
(E >= Xs && E <=Xe)
Wenn diese Abfrage auch nur einen Ergebnisdatensatz hat, dann liegt eine Überschneidug vor.
Ich habe mich an der booleschen Algebra versucht, aber ich glaube, dass man das nicht weiter vereinfachen kann.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hi Tom,
(Xs >= S && Xs <= E)
und
(Xe >= S && Xe <= E)
und
(S >= Xs && S <= Xe)
und
(E >= Xs && E <=Xe)
Da sollte ueberall "oder" stehen, nicht "und", sonst
Wenn diese Abfrage auch nur einen Ergebnisdatensatz hat, [...]
hat sie mit ziemlicher Sicherheit keinen :-)
Ich habe mich an der booleschen Algebra versucht, aber ich glaube, dass man das nicht weiter vereinfachen kann.
Klar, da kann man noch ausklammern und zusammenfassen wie die Sau, kommt doch alles doppelt und dreifach vor. Das Ganze[1] ist aequivalent zu (E >= Xs && S <= Xe). Das war doch in dem Thread schon weitgehend geklaert...
[1] Zusammen mit (S <= E && Xs <= Xe), versteht sich.
Viele Gruesse,
der Bademeister
Hello Bademeister,
(Xs >= S && Xs <= E)
und
(Xe >= S && Xe <= E)
und
(S >= Xs && S <= Xe)
und
(E >= Xs && E <=Xe)Da sollte ueberall "oder" stehen, nicht "und", sonst
Da sollte überall UND stehen, weil rein umgangssprachlich gemeit war, dass alle diese Bedingungen geprüft werden müssen. Wenn man dann daraus eine Abfrage macht, wird man diese natürlich nach abschließender Betrachtung und Korrektur der Grenzen einfach per ODER zusammenbauen.
Aber die Rückfrage hatte ich erwartet.
Klar, da kann man noch ausklammern und zusammenfassen wie die Sau, kommt doch alles doppelt und dreifach vor. Das Ganze[1] ist aequivalent zu (E >= Xs && S <= Xe). Das war doch in dem Thread schon weitgehend geklaert...
Das glaube ich nicht, dass das äquvalent ist.
Kannst Du es mal vorrechnen?
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hello Bademeister,
(Xs >= S && Xs <= E)
or
(Xe >= S && Xe <= E)
or
(S >= Xs && S <= Xe)
or
(E >= Xs && E <=Xe)
---------------------------- soll === sein: ?
(E >= Xs && S <= Xe)
Klar, da kann man noch ausklammern und zusammenfassen wie die Sau, kommt doch alles doppelt und dreifach vor. Das Ganze[1] ist aequivalent zu (E >= Xs && S <= Xe). Das war doch in dem Thread schon weitgehend geklaert...
ich habe jetzt dreimal im Kreis rumexperimentiert.
Eine Überführung der vier Bedingungen in die eine krieg ich irgendwie nicht hin.
Dabei erfüllt die ja tatsächlich die in den vier Bildern dargestellten Forderungen.
Ich geb mich also mit der grafischen Kontrolle zufrieden :-|
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
So jetzt habe es hinbekommmen :)...
Danke für die Antworten. Den Durchbruch bei mir hat Bademeisters Antwort gebracht.
So habe nun auch sogut wie Frei und verabschiede mich.
Gruß
sim
Hello,
So jetzt habe es hinbekommmen :)...
Danke für die Antworten. Den Durchbruch bei mir hat Bademeisters Antwort gebracht.
So habe nun auch sogut wie Frei und verabschiede mich.
Ach, hast Du Deine neu gewonnene Erkenntnis gelich auf die eigenen Termine angewandt?
Schau nochmal bei https://forum.selfhtml.org/?t=187994&m=1250935 vorbei, bevor Du ins Schwimmbad gehst :-)
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg