Dengan asumsi selalu ada awal untuk setiap jeda dan akhir, bukankah hal seperti ini akan lebih langsung?
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
Saya tidak begitu yakin seberapa besar nilai yang keluar dari TO_SECONDS() untuk stempel waktu saat ini; tetapi jika menjadi masalah saat dijumlahkan, jika dapat diubah menjadi
, 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
Anda dapat mendeteksi data "abnormal" dengan menambahkan yang berikut ini ke daftar ekspresi pilihan
, 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
Catatan:setiap interval "tidak tertutup" akan ditandai sebagai tidak normal; tanpa pemeriksaan awal dan akhir yang jauh lebih rumit dan mahal untuk interval untuk membedakan "terbuka" dari "tidak valid", itu mungkin yang terbaik yang bisa dilakukan. Jumlah yang digunakan untuk "Pemeriksaan integritas" tambahan yang menyamai -1 mungkin mengisyaratkan interval berakhir terbuka, tetapi juga bisa menunjukkan awal ganda yang salah.