mit Zeiten rechnen - Ermittlung der Arbeitszeit aus MySQL-Tabelle

dwex

Erfahrenes Mitglied
hallo leute,

ich habe folgendes problem.
ich würde gerne bei mir im büro eine "einfache" zeiterfassung realisieren.
wir haben einen webserver mit php und mysql laufen.

ich bekomme die zeiten (als datum und eine zweite/dritte spalte für die zeiten (start und stop) wie im mysql üblichen format oder auch als (unix)-timestamp in die mysql-tabelle) das ist kein problem
jetzt kommts aber - ich möchte natürlich am monatsende die zeiten auswerten können.
dazu müsste ich folgendes tun:

1. alle zeiten eines monats mit datum für jeden benutzer einzeln auslesen (das bekomme ich hin und in ein arry gespeichert)
2. jetzt müsste ich aber die die arbeitszeit (also die differenz aus start- und stopzeit) berechnen - und das bekomme ich nicht mehr hin.
3. sollten ja die differenzen dann auch zusammengezählt werden - da habe ich auch keine ahnung wie ich das machen soll (if oder for oder while schleife zusätzlcih inder schleife und die ganze geschichte in ein array schreiben - keine ahnung).

wer kann helfen?

vielen dank für eure hilfe
 
Hallo!

Ich würde es so machen:
Du speicherst für jeden Mitarbeiter den Tag im Format date (Bsp: 2005-04-15) und die Start- und Stopzeit als unix_timestamp (Bsp: 1113544800, 1113577200).
Dann liest Du die Daten des gesuchten Zeitraumes aus und hast sie in einem Array.
In einer 2. Schleife liest Du dann in dem Array die Werte für jeden Tag aus:
PHP:
$start = "1113544800";
$stop = "1113577200";
$diff = $stop - $start;
$diff = $diff / 3600;
echo $diff;
$diff hat dann den Wert der gearbeiteten Stunden. Du musst dann evtl. noch die Pausenzeiten herausrechnen.
Und $diff speicherst Du dann in einer $zeit (oder wie auch immer) und addierst den Wert eines jeden Tages hinzu.
Damit hast Du dann am Ende des Monats die gearbeiteten stunden.

redlama

P.S. Übrigens willkommen an Bo(a)rd! Da Du neu bist, möchte ich Dich auf die hier gültige Netiquette hinweisen. Dort wird unter anderem auch etwas über die Groß-/Kleinschreibung auf tutorials.de gesagt. :)
 
Um mal einen weiteren Vorschlag in den Raum zu werfen:
Ich würde das Datum nicht extra speichern, sondern Start und Stop als MySQL-DATETIME ablegen und mit den SQL-Datums- und Zeitfunktionen arbeiten.
Das ganze kannst Du direkt im SQL-Statement mit GROUP BY beliebig aggregieren oder auch tageweise ausgeben.

Eintragen ist auch ganz einfach: Wenn der Mitarbeiter kommt, klickt er einen Button "Ich bin da". Du machst einen INSERT und belegst Start mit NOW().
Wenn er geht klickt er auf "Bin weg". Daraufhin machst Du ein UPDATE und trägst bei Stop NOW() ein.

Gruß hpvw
 
Hallo,

das mit der SQL-Methode gefällt mir eigentlich ganz gut.
ich habe folgendes gemacht.

Ich habe eine MySQL-Tabelle mit den Spalten id - user - kommen - gehen - status
id - fülle ich mit auto_increment auf:

So ich mache nun einen Eintrag in der Datenbank - dann steht da folgendes

id - user - kommen - gehen - status
1 - name - 2005-04-27 17:00:00 - 0000-00-00 00:00:00 - im Haus

Wenn ich nun den Button "Abmelden" klicke dann mache ich ein Update über die ID
Das Ganze sieht dann so aus:

id - user - kommen - gehen - status
1 - name - 2005-04-27 17:04:45 - 2005-04-27 18:35:07 - Ausserhaus

Das klappt ja bestens soweit bin ich - jetzt kommts aber mit den Abfragen wann ein Mitarbeiter da war.

Ich hätte mir in der MySQL-Befehlsrefernz die Geschichte mit MONTH(datum) ausgesucht.
Nur kapiere ich offensichtlich die Syntax nicht so ganz - wie muss mein SQL-Query aussehen damit ich z.B. alle Einträge eines bestimmten Nutzers wiederum eines bestimmten Monats als Ausgabe bekomme.

Habe schon ein bischen experimentiert aber bin auf nichts gekommen.
Habe z.B. folgende Query gebaut:

PHP:
$abfrage = mysql_query("SELECT * FROM zeitkarte WHERE MONTH(NOW());") OR die(mysql_error());

Mit der bekomme ich alle Einträge raus - auch welche nicht dem aktuellen Monat entsprechen.
Wenn ich statt "NOW()" ein Datum angebe dann habe ich das gleiche Problem.

Es wäre sehr nett wenn Ihr mir kurz das erklären könntet und mich vielleicht mit einen Codeschnippsel bezüglich der Abfrage unterstützen könntet.

Vielen Dank im voraus.
 
Code:
SELECT * FROM zeitkarte WHERE MONTH(kommen)=MONTH(NOW())
Du solltest auch mit dem aktuellen Monat irgendwas vergleichen ;)
 
Hallo,

vielen Dank erstmal - was würde ich denn ohne euch machen - ich wäre aufgeschmissen.

Eine Frage hätte ich dann noch.

Wie kann ich denn jetzt mit diesen beiden Zeiten rechnen.
Ich möchte ja die Stunden und Minuten eines jeden Eintrags ermitteln und am Monatsende das auch noch als Gesamtsumme ausgeben.

Geht das vielleicht auch mit einer SQL-Abfrage oder muss ich da mit PHP rechnen und wie geht dann das bzw. wo kann ich mir das Nachlesen.

Vielen Dank nochmals
 
Der Link zu den Datums- und Zeitfunktionen steht oben zum Nachlesen.
Im Select müsste sowas in der Art funktionieren:
Code:
SEC_TO_TIME(UNIX_TIMESTAMP(gehen) - UNIX_TIMESTAMP(kommen))  AS zeit
 
Hallo nochmal,

anscheinend bin ich zu blöd (heute) dafür.

zu der Abfrage habe ich noch ein paar Fragen:

1. Wenn ich nun die Abfrage so hinbekomme und die Abfrage dann in ein Array schreibe (mit mysql_fetch_array) dann habe ich ein Arrayelement mit dem Namen "zeit" sehe ich das richtig?

2. ich habe die Abfrage mal in phpmyadmin probiert und zwar folgende:
Code:
SELECT * 
FROM `zeitkarte` SEC_TO_TIME( UNIX_TIMESTAMP( gehen ) - UNIX_TIMESTAMP( kommen ) ) AS zeit
LIMIT 0 , 30
auch habe ich probiert:
Code:
SELECT * 
FROM `zeitkarte` 
WHERE SEC_TO_TIME( UNIX_TIMESTAMP( gehen ) - UNIX_TIMESTAMP( kommen ) ) AS zeit
LIMIT 0 , 30
und ebenfalls - weil so sollte es ja sein (zumindest glaube ich das):
Code:
SELECT * 
FROM `zeitkarte` 
WHERE id = 1
AND SEC_TO_TIME( UNIX_TIMESTAMP( gehen ) - UNIX_TIMESTAMP( kommen ) ) AS zeit
LIMIT 0 , 30

Da schmeisst mir phpmyadmin nur einen Syntaxfehler aus:
Code:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AS zeit LIMIT 0 , 30' at line 1
Was mache ich hier falsch?
Bitte lacht mich jetzt nicht aus - aber ich hab das ganze immer noch nicht kapiert und bin ja auch noch nicht lange dabei mit PHP und schon garnicht mit MySQL

Vielen Dank im voraus (schäm)
 
Zuletzt bearbeitet:
Das ist ein "Feld" was Du auswählst:
Code:
SELECT 
id,
user,
kommen,
gehen,
status,
SEC_TO_TIME( UNIX_TIMESTAMP( gehen ) - UNIX_TIMESTAMP( kommen ) ) AS zeit
FROM `zeitkarte` 
LIMIT 0 , 30
 
Hallo,

wann werde ich das begreifen.

DANKE das hat wunderbar geklappt - aber warum funktioniert das nicht mit:

SELECT *

Warum muss ich hier alle Felder der DB angeben.

(Wiedereinmal) Vielen Dank im voraus

PS: Vielen Dank für deine Geduld
 
Zuletzt bearbeitet:
Zurück