Om man antar att det alltid finns en början för varje paus och slut, skulle inte något sådant här vara mer direkt?
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
Jag är inte helt säker direkt hur stora värdena som kommer ut från TO_SECONDS() är för aktuella tidsstämplar; men om de är ett problem när de summeras, kan om ändras till
, 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
Du kan upptäcka "onormala" data genom att lägga till följande i listan med utvalda uttryck
, 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
Obs:alla "oslutna" intervall kommer att markeras som onormala; utan mycket mer komplicerad och dyrbar start- och slutkontroll efter intervaller för att skilja "öppen" från "ogiltig" är det nog det bästa som kan göras. Summan som används för ytterligare "integrityCheck" som är lika med -1 kan antyda ett öppet intervall, men kan också indikera en felaktig dubbelstart.