Tôi nghĩ bạn muốn logic như sau, nơi bạn kiểm tra xem có tồn tại một bản ghi đóng cho mọi bản ghi mở hay không. Tuy nhiên, có vẻ như không thể nhận được kết quả mong đợi của bạn bằng cách sử dụng dữ liệu được cung cấp.
DECLARE @emp_swipe_rec table (EMPLOYEE_ID int, TASK_ID int, SWIPE_TYPE char(1), SWIPE_IN_OUT_TIME datetime2);
DECLARE @Now datetime2 = '2021-03-07 16:40:00.000'; --sysdatetime();
INSERT INTO @emp_swipe_rec (EMPLOYEE_ID, TASK_ID, SWIPE_TYPE, SWIPE_IN_OUT_TIME)
VALUES
(1,1,'I','2021-03-07 08:00:00.000'),
(2,2,'I','2021-03-07 08:00:00.000'),
(1,1,'O','2021-03-07 15:00:00.000'),
(1,3,'I','2021-03-07 16:00:00.000');
SELECT I.EMPLOYEE_ID, I.TASK_ID
, DATEDIFF(MINUTE, I.SWIPE_IN_OUT_TIME, @Now) AS TimeSpent
FROM @emp_swipe_rec I
WHERE SWIPE_TYPE = 'I'
-- Rule out any where a closing record in the future exists
AND NOT EXISTS (
SELECT 1
FROM @emp_swipe_rec O
WHERE O.EMPLOYEE_ID = I.EMPLOYEE_ID
AND O.TASK_ID = I.TASK_ID
AND SWIPE_TYPE = 'O'
AND O.SWIPE_IN_OUT_TIME > I.SWIPE_IN_OUT_TIME
);
Trả về phần sau bằng cách sử dụng dấu thời gian cho 40 phút - nhưng không chắc bạn đã nghĩ ra 130 phút như thế nào:
EMPLOYEE_ID | TASK_ID | TimeSpent |
---|---|---|
2 | 2 | 520 |
1 | 3 | 40 |
Xin lưu ý để tham khảo trong tương lai, nếu bạn cung cấp cho bạn dữ liệu mẫu theo cách này (DDL + DML), bạn không chỉ làm cho câu hỏi của mình rõ ràng hơn mà còn giúp mọi người trả lời dễ dàng hơn nhiều