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

Hvordan vælger man kun swipe-in-brugere fra tabellen, som har alle swipe-poster

Jeg tror, ​​du vil have logik som følgende, hvor du tjekker, om der findes en afsluttende rekord for hver åbningsrecord. Det ser dog ikke ud til at være muligt at få dine forventede resultater ved at bruge de angivne data.

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

Returnerer følgende ved hjælp af et tidsstempel, der giver 40 minutter - men usikker på, hvordan du kom frem til 130 minutter:

EMPLOYEE_ID TASK_ID Tid brugt
2 2 520
1 3 40

Bemærk venligst til fremtidig reference, hvis du giver dig eksempeldata på denne måde (DDL+DML), gør du ikke kun dit spørgsmål klarere, du gør det også meget nemmere for folk at svare




  1. Sådan bruger du SqlTransaction i C#

  2. Re-slaving af en nedbrudt MySQL-masterserver i semisynkron replikeringsopsætning

  3. Hvordan RAND() virker i MariaDB

  4. Ny bruger og LDAP-styring i ClusterControl 1.8.2