Hvis vi antager, at der altid er en start for hver pause og afslutning, ville sådan noget ikke være mere direkte?
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
Jeg er umiddelbart ikke helt sikker på, hvor store værdierne, der kommer ud af TO_SECONDS() er for aktuelle tidsstempler; men hvis de er et problem, når de summeres, kan hvis ændres til
, 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
Du kan detektere "unormale" data ved at tilføje følgende til listen over udvalgte udtryk
, 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
Bemærk:alle "ulukkede" intervaller vil blive markeret som unormale; uden meget mere kompliceret og dyrt start- og sluttjek for intervaller for at skelne "åben" fra "ugyldig", er det nok det bedste, der kan gøres. Summen brugt for yderligere "integrityCheck" svarende til -1 kan antyde et åbent interval, men kan også indikere en fejlagtig dobbeltstart.