Ik denk dat je logica zoals de volgende wilt, waarbij je controleert of er een sluitingsrecord bestaat voor elk openingsrecord. Het lijkt echter niet mogelijk om de verwachte resultaten te krijgen met de verstrekte gegevens.
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
);
Retourneert het volgende met een tijdstempel van 40 minuten - maar weet niet hoe je aan 130 minuten bent gekomen:
EMPLOYEE_ID | TASK_ID | TimeSpent |
---|---|---|
2 | 2 | 520 |
1 | 3 | 40 |
Houd er rekening mee dat als u u op deze manier voorbeeldgegevens verstrekt (DDL+DML), uw vraag niet alleen duidelijker wordt, maar ook voor mensen veel gemakkelijker om te beantwoorden