phpbar.de logo

Mailinglisten-Archive

[php] Zeitkontrolle

[php] Zeitkontrolle

Lutz Zetzsche Lutz.Zetzsche at sea-rescue.de
Die Okt 11 11:17:45 CEST 2005


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