一時停止と終了ごとに常に開始があると仮定すると、このようなものはより直接的ではないでしょうか?
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
TO_SECONDS()から出力される値が、現在のタイムスタンプに対してどれほど大きいかはよくわかりません。ただし、合計時に問題が発生する場合は、
に変更できます。 , 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
選択式リストに以下を追加することで、「異常な」データを検出できます
, 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
注:「閉じられていない」間隔は異常としてマークされます。 「オープン」と「無効」を区別するための間隔の開始と終了のチェックがはるかに複雑で費用がかかることなく、実行できる最善の方法です。 -1に等しい追加の「integrityCheck」に使用される合計は、オープンエンドの間隔を示唆している可能性がありますが、誤ったダブルスタートを示している可能性もあります。