Løsningen som Jens beskriver ovenfor er fin nok - men alt for kompliceret.
MySQL (som også er tagget på denne tråd) indeholder allerede en masse gode funktioner til at arbejde med tid og tidsforskelle. (REF:
http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html )
En simpel MySQL tabel skulle kunne klare arbejdet - noget i stil med: id (int, primkey), fra (timestamp), til (timestamp)
Derefter laver du alle dine udregninger med SQL i queries - der er ikke nogen grund til at lave beregninger i PHP.
Funktionen som vi er særligt interesserede i er TIME_DIFF; Den tager to argumenter, altså fra og til, og returnerer forskellen i tid.
http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_timediffSELECT SEC_TO_TIME(SUM(TO_SECONDS(TIME_DIFF(fra,til)))) FROM arbejdstid WHERE fra >= '2012-01-01 00:00:00' AND til <= '2012-01-31 23:59:00'
Ovenstående query returnerer tid du har arbejdet mellem 1 januar 2012 og 31 januar 2012, i formatet: TT:MM: SS (edit: mellemrummet er for at undgå tossede smileys!)
Du kan tilføje WHERE clauses som filtrere på projekter osv efter ønske.
Det er meget nemmere at bruge de indbyggede funktioner i relationelle databaser end at genopfinde dem i scripting sprog. Datetime datatypen i MySQL er endda meget fleksibel, og det er muligt at sekund konverteringen i min SELECT parameter i ovenstående query ikke engang er nødvendig - men det kan du nærlæse i manualen jeg linkede til.
PHPs rolle i dette tilfælde er at lave et interface til databasen, så du kan vælge hvilke data du vil se - hvilken måned (eller andet interval), hvilken projekt - og det kan gøre håndteringen af input til databasen nemmere. Men at håndtere beregningen i PHP er ikke effektivt eller nemt. Det er den allerede lange tråd et godt eksempel på ;-)
edit: Glemte at tage højde for tillæg; Det nemmeste er at køre to queries i stil med ovenstående; den første tager alle sekunder mellem fra og til i hele perioden, den anden tager sekunder mellem 18:00 og 23:59:59 i fra og til intervaller i hele perioden. Derefter er anslået løn blot ligmed: resultat1-resultat2 * basisløn/sekund + resultat2*basisløn/sekund. Simple nestede select statements er alt der er brug for: SELECT r.resultat1, r.resultat2 FROM ((SELECT resultat1 FROM ...) UNION (SELECT resultat2 FROM ...)) AS r
Indlæg senest redigeret d. 27.01.2012 15:39 af Bruger #17015