BlackBoard (http://www.black-board.net/index.php)
- Design, Programmierung & Entwicklung (http://www.black-board.net/board.php?boardid=55)
-- Programmieren (http://www.black-board.net/board.php?boardid=4)
--- PHP Zeiterfassung (http://www.black-board.net/thread.php?threadid=23254)


Geschrieben von Flux am 12.03.2008 um 17:30:

  Zeiterfassung

Moin,

Durch klick auf eine Uhr soll die Start- und durch erneutes klicken die Endzeit einer Arbeitsphase in die DB geschrieben werden. Soweit kein Problem.

Doch welches Format nehme ich am besten und wie rechne ich es aus, wieviele Stunden zwischen Start und Ende liegen?

mfg



Geschrieben von phlox81 am 12.03.2008 um 17:38:

 

Das lässt sich doch alles per SQL machen.

Als Datentyp für die Tabelle würde ich DATE oder DATETIME vorschlagen Augenzwinkern

Und dann jeweils ein Insert bzw. Update für Start und Ende.



Geschrieben von phoenix am 12.03.2008 um 17:57:

 

Falls es sich um eine MySQL Datenbank handelt schau dir zum berechnen der Zeit zwischen den zwei Uhrzeiten, die SQL Funktion SUBTIME mal genauer an. Hier ist noch ein Text der dir vielleicht beim Datentyp weiterhilft.



Geschrieben von Flux am 13.03.2008 um 09:26:

 

hi,

ok super danke, ich habe jetzt

select SUBTIME($startzeit,$endzeit);

normalerweise geb ich die php werte durch mysql_result(); aus. wie bekomm ich das ergebniss der subtime hierbei in eine variable?

habe es folgendermassen probiert, was allerdings nicht funktioniert:

php:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
include 'dbconnect.php';

$sqls     =    "select * from zeiterfassung";
$res    =    mysql_db_query($db$sqls$ident);

$start mysql_result($res,0,"start");
$ende mysql_result($res,0,"ende");


$sqls     =    "select SUBTIME('$start','$ende') as total";
$res    =    mysql_db_query($db$sqls$ident);

echo mysql_result($res,0,"total");



EDIT: wie ich gemerkt habe funktioniert:
SELECT SUBTIME('09:00:00','08:00:00') as total

wobei hingegen folgendes nicht funktioneirt:
SELECT SUBTIME('2008-03-13 09:00:00','2008-03-13 08:00:00') as total


habe als format wie beschrieben DATETIME gewählt. müsste doch eigentlich so klappen oder?



Geschrieben von phlox81 am 13.03.2008 um 12:19:

 

Hm, also select * ist erstmal böse, solltest du dir abgewöhnen. Wenn du nur start und ende brauchst, ist das besser, wenn du sie auch nur in das select statement schreibst.

Und dann müsste es evtl. sogar mit einem select gehen:

code:
1:
SELECT SUBTIME(time_table.start,time_table.ende) as total from time_table



Zum Datumsformat:
Schau dir mal die MySQL Time und Date funktionen an, wenn das am selben Tag ist, müsstest du dir evtl. da nur die Zeit rausholen.


phlox



Geschrieben von Flux am 13.03.2008 um 13:01:

 

danke dir!

hab gemerkt, dass ich nicht SUBTIME sondern TIMEDIFF benutzen muss.

grz

€dit:

jetzt hab ich noch das folgende problem:

ich möchte nun auch wissen, wie gross der aufwand insgesamt ist.
habe schon einiges probiert, komme aber nicht zu einem entsprechenden ergebnis. hat jmd eine idee, wie ich das sinvoll löse, dass ich am ende den totalen aufwand in hh:mm habe, wenn ich z.B. 3 einträge habe?

ich habe zwar bei jedem durchlauf z.B. den aufwand des eintrages wie obe berechnet z.B. "02:00". wenn ich jedoch z.B. 02:00 + 02:22 rechne gibt es mir lediglich "4" aus und nicht "04:22".



Geschrieben von phlox81 am 13.03.2008 um 15:02:

 

Könntest du noch mal deinen aktuellen Code posten?
Sonst fehlt mir da irgendwie der Anhaltspunkt.



Geschrieben von Flux am 13.03.2008 um 15:21:

 

php:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
$sqls =    "select * from zeiterfassung order by id asc";
        $res    =    mysql_db_query($db$sqls$ident);
        
        while ( $output mysql_fetch_assoc $res )){
        
              
            $startdatum = ($output 'start' ]);
            $enddatum = ($output 'ende' ]);
                
            //// ZEITBERECHNUNG
                // total pro eintrag berechnen
                $aktualid     = ($output 'id' ]);
                $sqls_total "SELECT TIMEDIFF( '$enddatum', '$startdatum' ) AS total from zeiterfassung where id = $aktualid";
                $res_total    mysql_db_query($db$sqls_total$ident);
                $total         mysql_result($res_total,0,"total");
                $total         substr("$total"0, -3); 
                
                // datum "start" umformatieren
                $splitdate split("-"$startdatum);
                $start  substr("$splitdate[2]"02); // Tag
                $start .= ".";
                $start .= "$splitdate[1]."// Monat
                $start .= substr("$splitdate[0]."04); // Jahr in 2 stellen 
                $start .= " ";
                
                $splittime split(":"$startdatum);
                $start .= substr("$splittime[0]"113); // Stunden
                $start .= ":";
                $start .= "$splittime[1]"// Minute

                                // HIER STEHT DIE AUSGABE

                 }


dieser ablauf geht pro eintrag einmal durch (siehe while schlaufe auf zeile 4).
$total kann z.B. "02:22" oder "01:59" sein.
was ich also möchte ist zusammengerechnet die werte aller durchläufe in $total.



Geschrieben von phlox81 am 13.03.2008 um 15:30:

 

code:
1:
select TIMEDIFF(start,ende) from zeiterfassung order by id asc


Und dann müsstest du evtl. in PHP mit dem datentyp date oder time das zusammen rechnen. Kenn mich da aber auch nicht so mehr aus, mach zur Zeit nix mit PHP.



Geschrieben von Flux am 13.03.2008 um 15:48:

 

im endeffekt stellt sich eigentlich nur die frage:

wie rechne ich "01:31" + "01:31", dass es korrekt "03:02" und nicht "2" ergibt.



Geschrieben von phlox81 am 14.03.2008 um 20:16:

 

Soweit ich das verstehe, müsstest du in PHP erstmal die Zeit in sekunden umrechnen, und dann addieren. Danach müsstest du dann wieder zurück umwandeln.

Das ließe sich notfalls aber auch schnell selber implementieren.



Geschrieben von Flux am 15.03.2008 um 01:09:

 

habs jetzt folgendermassen:

php:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
$dauer1 "01:32";
$dauer2 "02:32";

// teilen
$splittime1 split(":"$dauer1);
$splittime2 split(":"$dauer2);

// minuten in sekunden
$splittime1sek = ($splittime1[0] * 60);
$splittime2sek = ($splittime2[0] * 60);

// addieren
$splittimetotalsek $splittime1sek $splittime2sek $splittime1[1] + $splittime2[1];

echo $splittimetotalsek;


nun hab ich mit $splittimetotalsek das total in sekunden. ich kann nun zwar durch 60 rechnen, weiss aber ned, wie ich die restlichen sekunden da wieder raus kriege?

mfg



Geschrieben von Misel am 15.03.2008 um 09:49:

 

php:
1:
2:
$totelminutes round($splittimetotalsek 600);
$totelseconds $splittimetotalsek 60;


http://www.php.net/operators.arithmetic



Geschrieben von Flux am 15.03.2008 um 16:56:

 

danke, habs jetzt noch einfacher lösen können, wusste bloss nicht, dass das so: geht

php:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
$dauer1 "01:32";
$dauer2 "02:32";

// stunden/minuten splitten
$splittime1 split(":"$dauer1);
$splittime2 split(":"$dauer2);

// minuten in sekunden umrechnen
$splittime1sek = ($splittime1[0] * 60);
$splittime2sek = ($splittime2[0] * 60);

// sekunden zusammenzählen
$splittimetotalsek $splittime1sek $splittime2sek $splittime1[1] + $splittime1[1];

// in format i:s umrechnen
echo date("i:s"$splittimetotalsek);


Forensoftware: Burning Board 2.3.6, entwickelt von WoltLab GmbH