Angenommen, es gibt immer einen Anfang für jede Pause und jedes Ende, wäre so etwas nicht direkter?
SELECT t.task
, SUM(TO_SECONDS(t.stime)
* CASE WHEN t.status IN (1) THEN -1
WHEN t.status IN (2, 3) THEN 1
ELSE 0
END
) AS totalTimeSecs
FROM tblwork AS task
GROUP BY t.task
Ich bin mir nicht ganz sicher, wie groß die Werte, die aus TO_SECONDS() kommen, für aktuelle Zeitstempel sind; aber wenn sie bei der Summierung ein Problem darstellen, könnte if in
geändert werden , SUM((TO_SECONDS(t.stime) - some_constant_just_before_or_at_your_earliest_seconds)
* CASE WHEN t.status IN (1) THEN -1
WHEN t.status IN (2, 3) THEN 1
ELSE 0
END
) AS totalTimeSecs
Sie können "anormale" Daten erkennen, indem Sie Folgendes zur Liste der ausgewählten Ausdrücke hinzufügen
, CASE WHEN SUM(CASE
WHEN t.status IN (1) THEN -1
WHEN t.status IN (2, 3) THEN 1
ELSE 0 END
) = 0
THEN 'OK'
ELSE 'ABNORMAL'
END AS integrityCheck
Hinweis:Alle „nicht geschlossenen“ Intervalle werden als anormal markiert; Ohne viel kompliziertere und teurere Start- und Endprüfung auf Intervalle, um "offen" von "ungültig" zu unterscheiden, ist dies wahrscheinlich das Beste, was getan werden kann. Die für den zusätzlichen "integrityCheck" verwendete Summe von -1 könnte auf ein offenes Intervall hindeuten, könnte aber auch auf einen fehlerhaften Doppelstart hindeuten.