Suponiendo que siempre hay un comienzo para cada pausa y un final, ¿no sería algo así más directo?
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
No estoy muy seguro de cuán grandes son los valores que salen de TO_SECONDS() para las marcas de tiempo actuales; pero si son un problema cuando se suman, si podrían cambiarse a
, 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
Puede detectar datos "anormales" agregando lo siguiente a la lista de expresiones seleccionadas
, 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
Nota:cualquier intervalo "no cerrado" se marcará como anormal; sin una verificación inicial y final mucho más complicada y costosa de los intervalos para diferenciar "abierto" de "no válido", es probablemente lo mejor que se puede hacer. La suma utilizada para "integrityCheck" adicional igual a -1 podría insinuar un intervalo abierto, pero también podría indicar un comienzo doble erróneo.