select如何只刷入有刷卡记录的table用户

How do select only swipe-in users from the table which has all swipe records

我有一个 SQL 服务器 table task_swipe_rec,它只有 6 列。我想知道现在有多少人刷卡完成分配的任务,以及到目前为止他们在这些任务上花费的分钟列表。

我希望获得当前刷入的员工未刷出(未完成)的任务列表以及每项任务花费的分钟数。

Employee_ID Task_Id Swipe_Type Swipe_In_Out_Time Department Emp_Swipe_Rec_PK
EMP1 TASK1 I 2021-03-07 08:00:00.000 MARKETING 1
EMP2 TASK2 I 2021-03-07 08:00:00.000 SALES 2
EMP1 TASK1 O 2021-03-07 15:00:00.000 MARKETING 3
EMP1 TASK3 I 2021-03-07 16:00:00.000 MARKETING 4
SELECT
    one.EMPLOYEE_ID,
    one.TASK_ID
    DATEDIFF( minute, one.SWIPE_IN_OUT_TIME, GETDATE() ) AS TimeSpent,   
FROM
    emp_swipe_rec one
    INNER JOIN emp_swipe_rec two ON two.SWIPE_TYPE = 'I'
WHERE
    one.Employee_Id = two.Employee_Id
    AND
    one.TASK_ID = two.TASK_ID

预期结果:

Employee_ID Task_Id TimeSpent
EMP2 TASK2 130
EMP1 TASK3 40

我想你需要像下面这样的逻辑,你检查每条开盘记录是否存在一个闭盘记录。但是,使用提供的数据似乎无法获得预期的结果。

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

Returns 以下使用给出 40 分钟的时间戳 - 但不确定您是如何得出 130 分钟的:

EMPLOYEE_ID TASK_ID TimeSpent
2 2 520
1 3 40

请注意以备将来参考,如果您以这种方式 (DDL+DML) 为您提供样本数据,您不仅可以使您的问题更清楚,还可以让人们更容易回答