Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie wählen Sie nur Swipe-In-Benutzer aus der Tabelle aus, die alle Swipe-Datensätze enthält

Ich denke, Sie möchten eine Logik wie die folgende, bei der Sie prüfen, ob für jeden Eröffnungsdatensatz ein Abschlussdatensatz vorhanden ist. Es scheint jedoch nicht möglich zu sein, die erwarteten Ergebnisse mit den bereitgestellten Daten zu erzielen.

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

Gibt Folgendes mit einem Zeitstempel zurück, der 40 Minuten ergibt - aber nicht sicher ist, wie Sie auf 130 Minuten gekommen sind:

EMPLOYEE_ID TASK_ID Verbrachte Zeit
2 2 520
1 3 40

Bitte beachten Sie für zukünftige Referenzzwecke:Wenn Sie Ihre Beispieldaten auf diese Weise (DDL+DML) bereitstellen, wird Ihre Frage nicht nur klarer, sondern Sie erleichtern den Leuten auch die Beantwortung erheblich