Mailinglisten-Archive |
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.
Getestet wurde auf einer Tabelle mit 64.935 Eintraegen.
m. b. G. Norbert
_____________________
normal: 02682-966898
Notruf: 0163-3613642
---------------------
e.o.m.
php::bar PHP Wiki - Listenarchive