Za předpokladu, že každá pauza a konec má vždy začátek, nebylo by něco takového přímější?
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
Nejsem si úplně jistý, jak velké jsou hodnoty, které vycházejí z TO_SECONDS() pro aktuální časová razítka; ale pokud jsou problémem při sčítání, pokud je lze změnit na
, 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
"Nenormální" data můžete zjistit přidáním následujícího do seznamu vybraných výrazů
, 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
Poznámka:všechny „neuzavřené“ intervaly budou označeny jako abnormální; bez mnohem komplikovanějšího a dražšího začátku a konce kontroly intervalů pro odlišení "otevřeného" od "neplatného" je to asi to nejlepší, co lze udělat. Součet použitý pro další "integrityCheck" rovný -1 může naznačovat otevřený interval, ale může také znamenat chybné dvojité spuštění.