Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да изберете само потребители с плъзгане от таблицата, която съдържа всички записи за плъзгане

Мисля, че искате логика като следната, където проверявате дали има затварящ запис за всеки отварящ запис. Въпреки това не изглежда възможно да получите очакваните резултати с помощта на предоставените данни.

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

Връща следното, използвайки клеймо за време, което дава 40 минути - но не съм сигурен как сте стигнали до 130 минути:

EMPLOYEE_ID TASK_ID Прекарано време
2 2 520
1 3 40

Моля, обърнете внимание за бъдещи справки, че ако ви предоставите примерни данни по този начин (DDL+DML), вие не само правите въпроса си по-ясен, но и много по-лесно за хората да отговорят




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Инкрементът на идентичността на колоната на SQL Server 2012 скача от 6 на 1000+ при 7-ми запис

  2. Копирайте данни от една колона в друга колона

  3. Как да заключите изключително ред, който предотвратява операцията CRUD

  4. Екраниране на низ в SQL Server, така че да е безопасен за използване в израза LIKE

  5. Заменете стойността на реда с празен низ, ако се дублира