SQL - 交换/交换字段值

时间:2017-04-04 08:07:29

标签: sql sql-server

感谢您的帮助!这是另一个......

情况:

我们公司的运营时间为上午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),如何交换他们的检查类型?

非常感谢你们!

2 个答案:

答案 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的演示

Rextester