Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come selezionare solo gli utenti a scorrimento dalla tabella che contiene tutti i record di scorrimento

Penso che tu voglia una logica come la seguente, in cui controlli se esiste un record di chiusura per ogni record di apertura. Tuttavia non sembra possibile ottenere i risultati attesi utilizzando i dati forniti.

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

Restituisce quanto segue utilizzando un timestamp che fornisce 40 minuti, ma non sei sicuro di come sei arrivato a 130 minuti:

ID_DIPENDENTE TASK_ID Tempo trascorso
2 2 520
1 3 40

Nota per riferimento futuro, se fornisci dati campione in questo modo (DDL+DML) non solo rendi più chiara la tua domanda, ma rendi anche molto più facile per le persone rispondere