Giả sử luôn có một điểm bắt đầu cho mỗi lần tạm dừng và kết thúc, chẳng phải những thứ như thế này sẽ trực tiếp hơn sao?
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
Tôi không chắc chắn về giá trị xuất phát từ TO_SECONDS () đối với dấu thời gian hiện tại lớn như thế nào; nhưng nếu chúng là một vấn đề khi được tổng hợp, nếu có thể được thay đổi thành
, 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
Bạn có thể phát hiện dữ liệu "bất thường" bằng cách thêm thông tin sau vào danh sách biểu thức đã chọn
, 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
Lưu ý:bất kỳ khoảng thời gian "không được tiết lộ" nào sẽ được đánh dấu là bất thường; mà không cần kiểm tra khoảng thời gian bắt đầu và kết thúc phức tạp và tốn kém hơn nhiều để phân biệt "mở" với "không hợp lệ", đó có lẽ là cách tốt nhất có thể được thực hiện. Tổng được sử dụng cho "Kiểm tra toàn vẹn" bổ sung bằng -1 có thể gợi ý về khoảng thời gian kết thúc mở, nhưng cũng có thể chỉ ra một lần bắt đầu kép không chính xác.