Jag tror att du vill ha logik som följande, där du kontrollerar om det finns ett slutrekord för varje öppningspost. Det verkar dock inte vara möjligt att få dina förväntade resultat med den information som tillhandahålls.
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
);
Returnerar följande med en tidsstämpel som ger 40 minuter – men osäker på hur du kom fram till 130 minuter:
EMPLOYEE_ID | TASK_ID | Tid |
---|---|---|
2 | 2 | 520 |
1 | 3 | 40 |
Observera för framtida referens, om du tillhandahåller exempeldata på detta sätt (DDL+DML) gör du inte bara din fråga tydligare, du gör det också mycket lättare för människor att svara