Jörgs Webnotizen

MariaDB: Jahresarbeitszeit 838:59 Stunden

Aus einer Zeiterfassungs-Datenbank in MariaDB wollte ich mir die Jahresarbeitszeit verschiedener User ausgeben lassen. Während die Stundenanzahl pro Monat noch plausibel erschien, betrug die Stundenzahl innerhalb des letzten Jahres immer genau 838:59 Stunden. In der betreffenden Datenbank-Tabelle beinhalten die einzelnen Einträge jeweils einen Zeitstempel für Start und Ende der Arbeitszeit im DATETIME Format. Die Abfrage erstellte ich entsprechend folgendermaßen:


SELECT 
TIME_FORMAT(
    SEC_TO_TIME(SUM(TIMESTAMPDIFF(SECOND, start_time, end_time))),
    '%k:%i'
) AS total_hours
FROM time_track
WHERE user = 42
AND start_time BETWEEN DATE_SUB(NOW(), INTERVAL 1 YEAR) AND NOW()

Dass MariaDB (wie auch MySQL) hier stets 838:59 Stunden zurückgab, hatte nun einen ganz einfachen Grund: mit SEC_TO_TIME wird die Summe der Sekunden in das TIME Format umgewandelt, welches auf den Wertebereich -838:59:59.999999 bis 838:59:59.999999 beschränkt ist (siehe hierzu auch Dokumentation von TIME)

Besteht die Chance, dass dieser Bereich nicht ausreicht, sollte man sich von der Datenbank nur die Summe der Sekunden ausgeben lassen, und diese dann in der eigentlichen Anwendung in das gewünschte Format umwandeln. In PHP könnte man beispielsweise solch eine Funktion verwenden, um Sekunden in eine Ausgabe von Stunden und Minuten zu überführen:


function sec_to_time($seconds)
{
    $hours = $seconds / 3600;
    $minutes = ($seconds / 60) % 60;
    return sprintf("%d:%02d", $hours, $minutes);
}
Tags: MariaDB, PHP