Seiten

Sonntag, 16. März 2014

Zeiterfassung in MySQL mit mehr als 839 Stunden

Sollte mal jemand in die Verlegenheit kommen, und in MySQL Zeiten jenseits von 838 Stunden, 59 Minuten und 59 Sekunden summieren und darstellen zu wollen, dem sei gesagt, dass das nicht immer ganz so einfach geht, wie man es sich vorstellen würde.
Na gut - im Prinzip könnte man es bei einem RTFM belassen, aber das ist weder höflich, noch hilfreich.

Auf alle Fälle ist es so, dass TIME unter MySQL nur einen Bereich zwischen '-838:59:59' und '838:59:59' darstellen kann. Alles, was größer ist, wird unter Umständen einfach nicht angezeigt. So hatte ich kürzlich einen Fall, wo statt 1.100 Stunden, einfach 838 Stunden angezeigt wurden. Es wurde nämlich SEC_TO_TIME verwendet, was sich auf TIME stützt.

Die Lösung ist hier folglich, dass man sich die Summe der Sekunden ausgeben lässt, und die Stunden und Minuten dann selbst berechnet und formatiert. In PHP könnte das z.B. folgendermaßen geschehen:

function get_zeit($zeit) {
        $sec_in_h=3600;
        $sec_in_m=60;
        $sec = $zeit;
        // stunden
        if ($sec >= $sec_in_h) {
            $zeit = floor($sec / $sec_in_h);
            $sec = $sec % $sec_in_h;
        }
        else {
            $zeit="0";
        }
        // minuten
        if ($sec >= $sec_in_m) {
            $zeit .= ":" . floor($sec / $sec_in_m);
        } elseif($zeit) {
            $zeit .= ":00";
        }
        return $zeit;
    }
Zurückgegeben wird dann ein String mit Doppelpunkten an den nötigen Stellen, also sowas wie 900:25 für 900 Stunden und 25 Minuten