sql >> Database >  >> RDS >> Sqlserver

Hoe selecteer je alleen swipe-in-gebruikers uit de tabel met alle swipe-records?

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




  1. Aanroepen van de privéfunctie binnen de hoofdtekst van het pakket

  2. Dynamische vervolgkeuzelijstwaarde uit database

  3. Kan het MySQL INT-type niet-nul NULL zijn?

  4. Mysql verbinding maken met server:toegang geweigerd voor gebruiker [e-mail beveiligd]