Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment sélectionner uniquement les utilisateurs de balayage dans le tableau qui contient tous les enregistrements de balayage

Je pense que vous voulez une logique comme celle-ci, où vous vérifiez s'il existe un enregistrement de clôture pour chaque enregistrement d'ouverture. Cependant, il ne semble pas possible d'obtenir les résultats escomptés en utilisant les données fournies.

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
);

Renvoie ce qui suit en utilisant un horodatage qui donne 40 minutes - mais vous ne savez pas comment vous avez trouvé 130 minutes :

EMPLOYEE_ID TASK_ID Temps passé
2 2 520
1 3 40

Veuillez noter, pour référence future, que si vous fournissez des exemples de données de cette manière (DDL+DML), non seulement vous clarifiez votre question, mais vous facilitez également la réponse des personnes