sql >> Databasteknik >  >> RDS >> Sqlserver

Hur väljer man bara swipe-in-användare från tabellen som har alla swipe-poster

Jag tror att du vill ha logik som följande, där du kontrollerar om det finns ett slutrekord för varje öppningspost. Det verkar dock inte vara möjligt att få dina förväntade resultat med den information som tillhandahålls.

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

Returnerar följande med en tidsstämpel som ger 40 minuter – men osäker på hur du kom fram till 130 minuter:

EMPLOYEE_ID TASK_ID Tid
2 2 520
1 3 40

Observera för framtida referens, om du tillhandahåller exempeldata på detta sätt (DDL+DML) gör du inte bara din fråga tydligare, du gör det också mycket lättare för människor att svara




  1. Oracle:Vänster sammanfoga mycket stor tabell och begränsa de sammanfogade raderna till en med det största fältvärdet

  2. Optimala MySQL-inställningar för frågor som levererar stora mängder data?

  3. Hur använder man liknande villkor med flera värden i sql server 2005?

  4. cd:-M:ogiltigt alternativ