phpbar.de logo

Mailinglisten-Archive

[php] Zeitkontrolle

[php] Zeitkontrolle

Norbert Pfeiffer norbert at itbw.de
Son Okt 9 22:25:44 CEST 2005


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