感谢您的帮助!这是另一个......
情况:
我们公司的运营时间为上午8点至下午6点 我们使用生物识别设备进行考勤 员工在按下手指之前先点击“IN”或“OUT”,然后按下手指,知道它是IN(AM)还是OUT(PM)。
问题:
有些员工在设备上错误地点击“OUT”并在检查IN时按下他们的手指,将其注册为OUT(AM)..反之亦然,IN(PM)。
以下是供参考的样本数据:
EmpID LogTime CheckType
1 4/4/2017 7:24:22 AM OUT
1 4/4/2017 18:02:11 PM IN
一名员工点击“OUT”,但时间早晨被认为是“IN”。下午离开办公室时点击“IN”。
问题:
使用 SQL (SQL Server),如何交换他们的检查类型?
非常感谢你们!
答案 0 :(得分:2)
Update attendance set checkType = 'IN' where LogTime between <min range> and <max range>
为早上时间提供一个范围与结帐时类似。
答案 1 :(得分:1)
我的策略是为每对员工记录分配一个行号。但是,我们通过日志时间和检查类型分配行号。如果订单正确,则查看按日期递增的给定员工记录对,两个行号应该锁定为1-2。但是,如果订单被颠倒,那么我们应该看到1-2的日志时间,但是21的检查类型。
WITH cte AS (
SELECT EmpID, LogTime, CheckType,
ROW_NUMBER() OVER (PARTITION BY EmpID ORDER BY LogTime) rn1,
ROW_NUMBER() OVER (PARTITION BY EmpID ORDER BY CheckType) rn2
FROM yourTable
)
UPDATE cte
SET CheckType = CASE WHEN CheckType = 'OUT' THEN 'IN' ELSE 'OUT' END
WHERE rn1 <> rn2
下表可能会显示我的想法:
EmpID LogTime CheckType rn1 rn2
1 4/4/2017 7:24:22 AM OUT 1 2
1 4/4/2017 18:02:11 PM IN 2 1
如果员工1
已正确记录时间,我们会看到:
EmpID LogTime CheckType rn1 rn2
1 4/4/2017 7:24:22 AM OUT 1 1
1 4/4/2017 18:02:11 PM IN 2 2
换句话说,两个计算的行号都是相同的。
以下是我与您的示例数据一起使用的CTE的演示: