[MySQL] Zeiterfassungssystem

C22

Mitglied
Hallo Forum,
nachdem ich auf dem weiten Markt der Zeiterfassungssysteme nichts geeignetes gefunden habe, hab ich beschlossen was eigenes zu programmieren. Jetzt bin ich am überlegen wie ich die Datenbank strukturiere.
Es geht um ein einfaches Zeiterfassungssystem für ca. 50 Mitarbeiter, das von "Stechuhr PCs" an den Eingängen sowie von jedem Arbeitsplatz aus bedient werden kann.

Hab mir überlegt in einer MySQL Datenbank für jeden Mitarbeiter eine eigene Tabelle anzulegen in der dann bei jeder Stempelung ein Datensatz hinzu kommt.

|____Startzeit____|____Endzeit_____|__Status__|
________________________________________
| 2006-01-18 08:30 | 2006-01-18 12:05 | Intern |
| 2006-01-18 12:05 | 2006-01-18 13:01 | Mittag |
| 2006-01-18 13:01 | 2006-01-18 14:51 | Intern |
| 2006-01-18 14:51 | 2006-01-18 14:59 | Rauchen |
| 2006-01-18 14:59 | 2006-01-18 18:05 | Intern |
| 2006-01-18 18:05 | 2006-01-19 08:35 |abwesend |
| 2006-01-19 08:35 | 2006-01-19 10:45 | Intern |

Bei jedem neuen Datensatz wird die aktuelle Zeit in das Endzeitfeld des letzten Datensatz und in das Startzeitfeld des neuen eingetragen.
Ist das ein gutes Konzept, bzw. hab ich etwas übersehen? Kann ich damit einfach z.B. alle "Intern" Zeiten addieren und ist etwas bestimmtes zu beachten beim Datumswechsel, also wenn eine Periode über Mitternacht hinweggeht.

Wäre sehr dankbar für Tipps und Erfahrungen.
 
C22 hat gesagt.:
Hab mir überlegt in einer MySQL Datenbank für jeden Mitarbeiter eine eigene Tabelle anzulegen...
Nein, lege eine Tabelle an und speichere zu dem Datensatz eine MitarbeiterID um die erfasste Zeit zuzuordnen.

C22 hat gesagt.:
... in der dann bei jeder Stempelung ein Datensatz hinzu kommt.
Damit speicherst Du auch die volle Freizeit, aber Ok, das lässt sich ja herausrechnen.

C22 hat gesagt.:
|____Startzeit____|____Endzeit_____|__Status__|
________________________________________
| 2006-01-18 08:30 | 2006-01-18 12:05 | Intern |
| 2006-01-18 12:05 | 2006-01-18 13:01 | Mittag |
| 2006-01-18 13:01 | 2006-01-18 14:51 | Intern |
| 2006-01-18 14:51 | 2006-01-18 14:59 | Rauchen |
| 2006-01-18 14:59 | 2006-01-18 18:05 | Intern |
| 2006-01-18 18:05 | 2006-01-19 08:35 |abwesend |
| 2006-01-19 08:35 | 2006-01-19 10:45 | Intern |
Den Status würde ich als Fremdschlüssel speichern und die möglichen Stati in einer weiteren Tabelle benennen.

Du solltest unbedingt mit dem Betriebsrat klären, wie genau die Erfassung sein darf. Ich bin mir relativ sicher, dass Du, wenn überhaupt, nicht mehr als (sinngemäß) Arbeitszeit, Freizeit und Pause als Unterscheidung genehmigt bekommst.

C22 hat gesagt.:
Ist das ein gutes Konzept, bzw. hab ich etwas übersehen?
Zur Abrechnung wird sich das so sicher noch nicht verwenden lassen, da wären Nacht- und Sonntagsarbeitszeitzuschläge, sowie weitere mögliche Multiplikatoren zu berücksichtigen.

C22 hat gesagt.:
Kann ich damit einfach z.B. alle "Intern" Zeiten addieren und ist etwas bestimmtes zu beachten beim Datumswechsel, also wenn eine Periode über Mitternacht hinweggeht.
Technisch ja, mit einem einfachen Query unter Verwendung der MySQL-Funktionen DATE_SUB() und SUM().

Gruß hpvw
 
Hallo,
gute Idee,
nur scheint es mir programmiertechnisch als auch in Hinsicht auf etwaige Auswertungen/Abfragen nicht sinnvoll zu sein, für jeden MA eine eigene Tabelle anzulegen.
Ggf. wäre folgende Variante überlegendswert:

tabelle_Mitarbeiter 1-------> n tabelleZeiten

In einer Mitarbeiter-Tabelle werden die MA geführt
In einer Zeiten-Tabelle wird auf den Primärschlüssel verlinkt (Fremdschlüsselbezug in Zeitentabelle)

Auf diese Weise können auch MA-übergreifende Auswertungen realisiert werden. Weiterhin ist es natürlich auch möglich, für jeden einzelnen MA die Zeiten auszulesen (Parameter: Schlüsselfeld des MA)

Ich hoffe, damit ist etwas geholfen
Beste Grüße
Phil
 
guten Morgen,
bin jetzt an der Implementierung dieses wunderbaren Tools. :)

Eine Frage, wie bekomme ich den letzten Eintrag einer bestimmten User-ID aus der Tabelle 'zeiten'? Also den aktuellen Status.
 
danke hpvw, funktioniert super.

Aber ich hab schon wieder ein neues Problem: Ich versuche die Zeiten zu addieren, folgendes SQL Statement hab ich mal testweise verwendet:

Code:
select sec_to_time(sum(time_to_sec(timediff(endzeit, startzeit)))) from zeiten where uid = 2

Bei uid = 1 funktioniert das hervorragend, aber bei uid = 2 liefert mir die DB NULL zurück.
Ich hab ca. 30 User und bei ca. einem Drittel wird NULL geliefert, beim Rest gehts, jemand eine Ahnung woran das liegt?

Code:
Id                      uid         status       startzeit            endzeit              
197                     1           1            2006-04-25 17:26:34  2006-04-25 17:26:47  
198                     1           10           2006-04-25 17:26:47  2006-04-25 17:26:59  
207                     1           10           2006-04-25 17:35:29  2006-04-26 09:41:24  
199                     1           1            2006-04-25 17:26:59  2006-04-25 17:27:51  
200                     1           10           2006-04-25 17:27:51  2006-04-25 17:32:20  
201                     1           1            2006-04-25 17:32:20  2006-04-25 17:35:29  
217                     1           1            2006-04-26 09:41:24  NULL                 
106                     2           1            2006-04-25 14:15:35  2006-04-25 14:27:44  
210                     2           10           2006-04-25 18:05:45  2006-04-26 09:17:31  
116                     2           6            2006-04-25 14:27:58  2006-04-25 15:37:17  
93                      2           1            2006-04-25 11:57:45  2006-04-25 11:58:44  
115                     2           7            2006-04-25 14:27:44  2006-04-25 14:27:58  
101                     2           1            2006-04-25 13:07:31  2006-04-25 14:15:18  
100                     2           7            2006-04-25 13:07:19  2006-04-25 13:07:31  
96                      2           1            2006-04-25 13:04:49  2006-04-25 13:07:19  
95                      2           5            2006-04-25 11:58:44  2006-04-25 13:04:49  
105                     2           7            2006-04-25 14:15:18  2006-04-25 14:15:35  
212                     2           1            2006-04-26 09:17:31  2006-04-26 09:17:53  
149                     2           4            2006-04-25 16:27:35  2006-04-25 18:05:45  
148                     2           5            2006-04-25 16:27:24  2006-04-25 16:27:35  
22                      2           4            2006-04-24 16:10:55  2006-04-25 11:57:45  
213                     2           4            2006-04-26 09:17:53  NULL
147                     2           4            2006-04-25 16:27:11  2006-04-25 16:27:24  
144                     2           7            2006-04-25 15:37:17  2006-04-25 16:27:11
 
nein, den hab ich ja bei allen Usern einmal.

ich glaube das passiert wenn die Gesamtzeit über 24 Stunden beträgt....:confused:
 

Neue Beiträge

Zurück