Zakładając, że zawsze jest początek dla każdej pauzy i końca, czy coś takiego nie byłoby bardziej bezpośrednie?
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
Nie jestem do końca pewien, jak duże są wartości wychodzące z TO_SECONDS() dla bieżących znaczników czasu; ale jeśli stanowią problem podczas sumowania, jeśli można je zmienić na
, 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
Możesz wykryć „nieprawidłowe” dane, dodając poniższe do listy wybranych wyrażeń
, 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
Uwaga:wszelkie „niezamknięte” interwały zostaną oznaczone jako nieprawidłowe; bez znacznie bardziej skomplikowanego i kosztownego sprawdzania początku i końca pod kątem interwałów w celu odróżnienia „otwarty” od „nieważny”, jest to prawdopodobnie najlepsze, co można zrobić. Suma użyta do dodatkowego „IntegrityCheck” równa -1 może wskazywać na interwał z otwartym zakończeniem, ale może również wskazywać na błędny podwójny start.