如何解决如何从具有所有刷卡记录的表中仅选择刷卡用户
我有一个只有 6 列的 sql Server 表 task_swipe_rec。我想知道现在有多少人为分配的任务刷卡,以及他们目前在这些任务上花费的时间列表。
我希望获得当前刷入的员工未刷出(未完成)的任务列表以及每项任务花费的分钟数。
Employee_ID | Task_Id | Swipe_Type | Swipe_In_Out_Time | 部门 | Emp_Swipe_Rec_PK |
---|---|---|---|---|---|
EMP1 | TASK1 | 我 | 2021-03-07 08:00:00.000 | 营销 | 1 |
EMP2 | TASK2 | 我 | 2021-03-07 08:00:00.000 | 销售 | 2 |
EMP1 | TASK1 | O | 2021-03-07 15:00:00.000 | 营销 | 3 |
EMP1 | TASK3 | 我 | 2021-03-07 16:00:00.000 | 营销 | 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,(1,'O','2021-03-07 15:00:00.000'),3,'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) 提供示例数据,不仅可以让您的问题更清晰,而且可以让人们更容易回答
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。