Мисля, че искате логика като следната, където проверявате дали има затварящ запис за всеки отварящ запис. Въпреки това не изглежда възможно да получите очакваните резултати с помощта на предоставените данни.
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
);
Връща следното, използвайки клеймо за време, което дава 40 минути - но не съм сигурен как сте стигнали до 130 минути:
EMPLOYEE_ID | TASK_ID | Прекарано време |
---|---|---|
2 | 2 | 520 |
1 | 3 | 40 |
Моля, обърнете внимание за бъдещи справки, че ако ви предоставите примерни данни по този начин (DDL+DML), вие не само правите въпроса си по-ясен, но и много по-лесно за хората да отговорят