Ervan uitgaande dat er altijd een begin is voor elke pauze en einde, zou zoiets dan niet directer zijn?
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
Ik ben er niet helemaal zeker van hoe groot de waarden die uit TO_SECONDS() komen voor huidige tijdstempels zijn; maar als ze een probleem vormen bij het optellen, kan dit worden gewijzigd in
, 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
U kunt "abnormale" gegevens detecteren door het volgende toe te voegen aan de lijst met geselecteerde uitdrukkingen
, 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
Opmerking:alle "niet-afgesloten" intervallen worden als abnormaal gemarkeerd; zonder veel ingewikkelder en duurdere begin- en eindcontrole op intervallen om onderscheid te maken tussen "open" en "ongeldig", is dit waarschijnlijk het beste dat kan worden gedaan. De som die wordt gebruikt voor aanvullende "integrityCheck" gelijk aan -1 kan duiden op een interval met een open einde, maar kan ook duiden op een foutieve dubbele start.