Ако приемем, че винаги има начало за всяка пауза и край, няма ли нещо подобно да е по-директно?
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
Не съм съвсем сигурен колко големи са стойностите, които излизат от TO_SECONDS() за текущите времеви марки; но ако са проблем при сумиране, ако може да се промени на
, 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
Можете да откриете "ненормални" данни, като добавите следното към списъка с изрази за избор
, 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
Забележка:всички "незатворени" интервали ще бъдат маркирани като необичайни; без много по-сложни и скъпи начални и крайни проверки за интервали за разграничаване на "отворено" от "невалидно", това е може би най-доброто, което може да се направи. Сборът, използван за допълнителен "integrityCheck", равен на -1, може да намекне за отворен интервал, но също така може да показва погрешно двойно начало.