Mailinglisten-Archive |
Hi Norbert, Norbert Pfeiffer schrieb: > Hi Lutz, > >> nimmst Du dann einfach die zweite Variante und paßt sie etwas an. >> Dann hast Du anstatt drei, nämlich zwei Fälle: >> >> WHERE (Startzeit1 >= Startzeit2 AND Startzeit1 < Endzeit2) >> OR (Startzeit2 >= Startzeit1 AND Startzeit2 < Endzeit1) >> >> Der Trick besteht darin, einmal zu prüfen, ob die Startzeit der >> neuZeit in der Prüfzeit liegt, und einmal, ob die Startzeit der >> Prüfzeit in der neuZeit liegt. Durch diesen Sichtwechsel sparst >> Du Dir eine Prüfung. ;-) > hmm, > das scheint irgendwie zu stimmen, nur richtig kapieren tue ich es > noch nicht. Hast Du dafuer auch eine verbale Erklaerung ... ? ich habe meine Tabelle noch einmal aktuaslisiert, die die 11 Fälle darstellt. Zur korrekten Darstellung solltest Du sie Dir in einen Texteditor kopieren, mit fester Schriftbreite anzeigen lassen und vermutlich ein paar zusätzliche Zeilenumbrüche aus der Mail entfernen. Folgende Fälle gibt es also: +---+---+---+---+---+---+---+ | | A | | | B | | | +---+---+---+---+---+---+---+-----+-----------+-----------+-----+-----------+-----------+-----+-----+ | | a | | b | | | | a=A | | | | | b->(A, B) | | | +---+---+---+---+---+---+---+-----+-----------+-----------+-----+-----------+-----------+-----+-----+ | | a | | | b | | | a=A | | | b=B | | | | | +---+---+---+---+---+---+---+-----+-----------+-----------+-----+-----------+-----------+-----+-----+ | | a | | | | b | | a=A | | | | B->(a, b) | | | | +---+---+---+---+---+---+---+-----+-----------+-----------+-----+-----------+-----------+-----+-----+ | | | a | b | | | | | a->(A, B) | | | | b->(A, B) | | | +---+---+---+---+---+---+---+-----+-----------+-----------+-----+-----------+-----------+-----+-----+ | | | a | | b | | | | a->(A, B) | | b=B | | | | | +---+---+---+---+---+---+---+-----+-----------+-----------+-----+-----------+-----------+-----+-----+ | | | a | | | b | | | a->(A, B) | | | B->(a, b) | | | | +---+---+---+---+---+---+---+-----+-----------+-----------+-----+-----------+-----------+-----+-----+ | a | | | b | | | | | | A->(a, b) | | | b->(A, B) | | | +---+---+---+---+---+---+---+-----+-----------+-----------+-----+-----------+-----------+-----+-----+ | a | | | | b | | | | | A->(a, b) | b=B | | | | | +---+---+---+---+---+---+---+-----+-----------+-----------+-----+-----------+-----------+-----+-----+ | a | | | | | b | | | | A->(a, b) | | B->(a, b) | | | | +---+---+---+---+---+---+---+-----+-----------+-----------+-----+-----------+-----------+-----+-----+ | a | b | | | | | | | | | | | | | A=b | +---+---+---+---+---+---+---+-----+-----------+-----------+-----+-----------+-----------+-----+-----+ | | | | | a | b | | | | | | | | a=B | | +---+---+---+---+---+---+---+-----+-----------+-----------+-----+-----------+-----------+-----+-----+ Die Fälle 1 bis 3 haben gemeinsam, daß die Startpunkte von neuZeit und Prüfzeit übereinstimmen (a = A). Die Fälle 4 bis 6 haben gemeinsam, daß der Startpunkt der neuZeit innerhalb der Prüfzeit liegt (A < a < B). Die Fälle 7 bis 9 haben gemeinsam, daß der Startpunkt der Prüfzeit innerhalb der neuZeit liegt (a < A < b). Bei Fall 10 liegt die Endzeit der neuZeit auf der Startzeit der Prüfzeit (A = b). Bei Fall 11 liegt die Endzeit der Prüfzeit auf der Startzeit der neuZeit (a = B). 1. - 3. kann man mit 4. - 6. und 7. - 9. zusammenlegen: => (A <= a < B) => (a <= A < b) Fall 10 und 11 fallen bei Deiner Definition der Überschneidung heraus. Wenn man diese beiden Fälle noch mit bedenken wollte, könnten sie ebenfalls mit 4. - 6. und 7. - 9. zusammengelegt werden (BETWEEN ... AND ...-Darstellung): => (A <= a <= B) => (a <= A <= b) Soweit die theoretische Herleitung. Praktisch sieht es so aus: Nimm zwei Kugelschreiber, die parallel liegen und deren Spitzen in dieselbe Richtung zeigen. Wenn Du sie aufeinanderzubewegst, dann beginnen sie nebeneinanderzuliegen, sobald die Spitze des Kugelschreibers B das Ende des Kugelschreibers A erreicht. Sie liegen nicht mehr ganz oder in Teilen nebeneinander, sobald die Spitze von Kugelschreiber A das Ende von Kugelschreiber B passiert hat. Wenn die Spitzen beider Kugelschreiber gleichauf liegen, wechselt die Sicht von der Spitze von Kugelschreiber B auf die Spitze von Kugelschreiber A. Aus dieser Betrachtungsweise resultiert die von mir für Deinen Fall vorgeschlagene Prüfung: WHERE (Startzeit1 >= Startzeit2 AND Startzeit1 < Endzeit2) OR (Startzeit2 >= Startzeit1 AND Startzeit2 < Endzeit1) > MySQL ist es irgendwie egal, beide Querys benoetigen 0,33 sec Das habe ich fast befürchtet. ;-) Aber ist nicht schlimm. Ich fand die Aufgabe sehr spannend. :-))) Viele Grüße Lutz
php::bar PHP Wiki - Listenarchive