Creo que desea una lógica como la siguiente, donde verifica si existe un registro de cierre para cada registro de apertura. Sin embargo, no parece posible obtener los resultados esperados con los datos proporcionados.
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
);
Devuelve lo siguiente usando una marca de tiempo que da 40 minutos, pero no está seguro de cómo llegó a 130 minutos:
ID_EMPLEADO | TAREA_ID | Tiempo empleado |
---|---|---|
2 | 2 | 520 |
1 | 3 | 40 |
Tenga en cuenta que, para referencia futura, si proporciona datos de muestra de esta manera (DDL+DML), no solo hará que su pregunta sea más clara, sino que también hará que sea mucho más fácil de responder para las personas