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) 为您提供样本数据,您不仅可以使您的问题更清楚,还可以让人们更容易回答
我有一个 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) 为您提供样本数据,您不仅可以使您的问题更清楚,还可以让人们更容易回答