En supposant qu'il y ait toujours un début pour chaque pause et chaque fin, quelque chose comme ça ne serait-il pas plus direct ?
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
Je ne suis pas tout à fait sûr de la taille des valeurs qui sortent de TO_SECONDS() pour les horodatages actuels ; mais s'ils posent problème lors de la sommation, ils peuvent être remplacés par
, 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
Vous pouvez détecter des données "anormales" en ajoutant ce qui suit à la liste d'expressions sélectionnées
, 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
Remarque :tout intervalle "non fermé" sera marqué comme anormal ; sans vérification de début et de fin beaucoup plus compliquée et coûteuse des intervalles pour différencier "ouvert" de "invalide", c'est probablement le mieux que l'on puisse faire. La somme utilisée pour un "integrityCheck" supplémentaire égal à -1 peut suggérer un intervalle ouvert, mais peut également indiquer un double départ erroné.