Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak wybrać tylko użytkowników przesuwających palcem z tabeli, która zawiera wszystkie rekordy przesunięcia?

Myślę, że potrzebujesz logiki takiej jak poniższa, gdzie sprawdzasz, czy istnieje rekord zamykający dla każdego rekordu otwierającego. Jednak uzyskanie oczekiwanych wyników przy użyciu dostarczonych danych nie wydaje się możliwe.

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

Zwraca następujące dane przy użyciu znacznika czasu, który daje 40 minut — ale nie masz pewności, jak wpadłeś na 130 minut:

EMPLOYEE_ID TASK_ID Czas spędzony
2 2 520
1 3 40

Uwaga na przyszłość, jeśli podasz przykładowe dane w ten sposób (DDL+DML), nie tylko sprawisz, że Twoje pytanie będzie bardziej przejrzyste, ale także ułatwisz ludziom udzielenie odpowiedzi




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. stuff() dodaje separator, nawet gdy pola są puste

  2. Jak dodać niestandardowe atrybuty do ciągu połączenia SQL?

  3. DATETIMEOFFSETFROMPARTS() Przykłady w SQL Server (T-SQL)

  4. Zmienianie kolumny tabeli w celu zaakceptowania większej liczby znaków

  5. Dziennik transakcji dla bazy danych jest pełny