Mailinglisten-Archive |
Hi Norbert, Norbert Pfeiffer schrieb: > Hi, > > und hier meine Ueberlegungen: > > Es gibt Pruefzeiten (aus der DB) und die neuZeit (vom Formular) > > Dabei treten IMHO drei Faelle auf: > (@nStart >= start)&&(@nStart < endet) # @nStart ist in der Pruefzeit > (@nEndet > start) &&(@nEndet <= endet) # @nEndet ist in der Pruefzeit > (@nStart < start) &&(@nEndet > endet) # neuZeit ueberdeckt Pruefzeit > > Hat man viele Eintraege, > wird jeder einzeln geprueft, doch es interessiert nur die Summe. > > SELECT SUM(IF((@nStart >= start) && (@nStart < endet) > OR (@nEndet > start) && (@nEndet <= endet) > OR (@nStart < start) && (@nEndet > endet), 1, 0)) AS Test > FROM zeiterfassung > WHERE name = 'Otto' > AND atag = '2004-01-21'; > > In dem Beispiel liegen die Eintraege wie folgt > +-------+------+------------+----------+----------+ > | id | name | atag | start | endet | > +-------+------+------------+----------+----------+ > | 15103 | Otto | 2004-01-21 | 05:00:00 | 06:00:00 | > | 15104 | Otto | 2004-01-21 | 07:00:00 | 08:00:00 | > | 15105 | Otto | 2004-01-21 | 09:00:00 | 10:00:00 | > | 15106 | Otto | 2004-01-21 | 11:00:00 | 12:00:00 | > +-------+------+------------+----------+----------+ > > Beispiel: > SET @nStart = '06:00:00'; # neuZeit > SET @nEndet = '07:00:00'; # neuZeit > > +------+ > | Test | > +------+ > | 0 | nach obigem Query > +------+ > 1 row in set (0.05 sec) > > +------+ > | Test | > +------+ > | 2 | nach dem vorgeschlagenen Query > +------+ > 1 row in set (0.06 sec) > > Das ist auch logisch, weil BETWEEN laut Handbuch immer > bei "groesser-gleich A && kleiner-gleich B" TRUE ausgibt, > dies jedoch hier nicht so sein kann/darf. Ok. Kein Problem. Ich hatte in meiner ersten Antwort ja auch gefragt: "Das einzige Problem, welches Du noch lösen mußt, ist die Frage, wie Du eine Überschreidung definierst? Ist z.B. folgendes erlaubt: 1. Zeit: 9:15-9:30 2. Zeit: 9:30-9:45 Oder gilt das als Überschneidung? Wenn ja, müßtest Du halt die oben genannten Prüfungen um einen Zeitversatz erweitern. :-)" Aus meinen finalen Vorschlag aus meinem letzten Beitrag, "WHERE (Startzeit1 BETWEEN Startzeit2 AND Endzeit2) OR (Startzeit2 BETWEEN Startzeit1 AND Endzeit1) Was gleichbedeutend ist mit: WHERE (Startzeit1 >= Startzeit2 AND Startzeit1 <= Endzeit2) OR (Startzeit2 >= Startzeit1 AND Startzeit2 <= Endzeit1)", 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. ;-) Viele Grüße Lutz
php::bar PHP Wiki - Listenarchive