Summe von Zeitdifferenzen

Also du hast eine Reihe von Zeitpunkten und die Zwischenräume sind deine Tätigkeiten. Die erste Buchung ist Status 1, Folgebuchungen zählen den Status hoch, die letzte ist immer Status 99. Kann man machen, daraus muss man sich dann die Zeiträume generieren, die kann man dann im zweiten Schritt aggregieren.
Diese Annahme von mir ist in deinen Beispieldaten nicht gegeben. taetigkeiten.id zählt zwar hoch, fängt aber nicht beim selben Wert an und für taetigkeiten.status_id = 99 findet auch in taetigkeiten.id ein unkalkulierbarer "Sprung" statt. taetigkeiten.status_id zählt auch nicht hoch, das ist nur der Fremdschlüssel auf status und wechselt dementsprechend.

In der Folge gibt es keinen Wert der zusammenhängend eine Reihenfolge bildet. Und damit kannst du meinen ersten Code total vergessen - kann nicht funktionieren. Das muss auch nicht, dafür gibt es ja Window-Functions, mit denen man Daten in Reihenfolge bringen kann.
Window-Funktionen habe ich nicht zur Verfügung (LAG).
Ich frage nochmal, wieso nicht? MySQL unterstützt das schon seit einigen Versionen.

Ohne Window-Functions wird das echt nicht schön. Man müsste es mit einem Subselect lösen, der kostet Performance. Hier mal ein Beispiel:
Code:
SELECT    tt.mitarbeiter_id,
        convert(DATE,tt.[time]) AS datum,
        tt.statiname,
        sum(datediff(minute,tt.[time],tt.time_bis)) AS sum_dauer
FROM    (

SELECT    taetigkeiten.*,
        stati.statiname,
        stati.farbe,
        (    SELECT    TOP 1 t.[time]
            FROM    taetigkeiten t
            WHERE    t.mitarbeiter_id = taetigkeiten.mitarbeiter_id
            AND    (    t.[time] > taetigkeiten.[time]
            OR        t.[time] = taetigkeiten.[time]
            AND        t.stati_id = 99 )
            ORDER BY t.[time] ASC
            --LIMIT 1
            ) AS time_bis
FROM    taetigkeiten
INNER JOIN stati
ON        taetigkeiten.stati_id = stati.id
WHERE    taetigkeiten.stati_id != 99

    ) tt
GROUP BY tt.mitarbeiter_id,convert(DATE,tt.[time]),tt.statiname
ORDER BY tt.mitarbeiter_id,convert(DATE,tt.[time]),tt.statiname
(Das ist MSSQL. Für MySQL wirst du das TOP 1 streichen müssen und durch das LIMIT 1 ersetzen, das ich hier auskommentiert habe. Auch datediff() und convert(DATE,<datetime_spalte>) müsstest du ersetzen.)

mitarbeiter_id datum statiname sum_dauer
-------------- ---------- ---------- -----------
1 2024-01-05 Büro 435
1 2024-01-05 Fahrt 30
1 2024-01-05 Kunde 105
2 2024-01-05 Büro 495
2 2024-01-05 Fahrt 45
2 2024-01-05 Kunde 0
2 2024-01-05 Pause 60

In deinen Daten gibt es auch noch eine Ungereimtheit. Mitarbeiter 2 hat um 17 Uhr Büro gestempelt und feierabend ist auch 17 Uhr. Ist das richtig? - Ich habe den Fall berücksichtigt, das ist die Position Kunde = 0 Minuten.
 
Werbung:
Zurück
Oben