2017-04-04 51 views
1

感谢您的帮助!这里的另一个...
SQL - 交换/交换字段值

现状:

公司从早8点工作 - 下午6:00。
我们使用生物识别设备进行考勤。
员工在按下手指前先点击设备上的“IN”或“OUT”,以知道它是IN(上午)还是OUT(下午)。

问题:

一些员工错误地点击设备上的 “OUT”,然后按自己的手指,因为他们签到,注册为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)的,我怎么能交换他们的checktypes?

非常感谢你们!

+1

如果有人有什么留下了一个小时,回来?即IN,OUT,IN和OUT同一天? – jarlh

+0

绝对确定他们在中午之前只有IN,而在中午之后才是OUT? – BeanFrog

+0

@jarlh我有一个代码来获得第一个IN,最后一个OUT。它工作得很好,除了我上面发布的问题:( – Jorz

回答

2
Update attendance set checkType = 'IN' where LogTime between <min range> and <max range> 

给早上的时间范围类似的情况下结帐。

+0

哇。 。 我从来没想过这点!我会试一试,并希望接受这个答案。谢谢! – Jorz

+0

没问题:)同样,你也可以做结账。 –

+1

我不确定这在任何情况下都能正常工作。这从来没有把'OUT'分配给任何东西。例如,这可能会导致员工很晚到达工作岗位,然后很快离职。 –

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 

换句话说,两个计算出来的行数都是一样的。

这是我与你的样本数据中使用的热膨胀系数的演示

Rextester

+0

Msg 102,Level 15,State 1,Line 9 't'附近语法不正确。 – Jorz

+0

我从更新中删除了别名。请再试一次。 –

+0

它工作..但错误的结果.. AM/PM随机与IN/OUT – Jorz