SQL-交换/交换字段值
谢谢你的帮助!这是另一个。。。SQL-交换/交换字段值,sql,sql-server,Sql,Sql Server,谢谢你的帮助!这是另一个。。。 情况: 我们公司的营业时间为上午8点至下午6点。 我们使用生物识别设备进行考勤。 员工将首先单击设备上的“输入”或“输出”,然后再按下设备的手指,以了解设备是在(上午)还是在(下午)输入 问题: 一些员工错误地点击设备上的“OUT”按钮,并在签到时按下手指,将其注册为OUT(AM)。。反之亦然,在(PM)中 以下是供参考的样本数据: 一名员工打了“出局”,但时间被视为凌晨“进入”。下午离开办公室时打电话进来 问题: 使用SQL(SQL Server),如何交换
情况: 我们公司的营业时间为上午8点至下午6点。
我们使用生物识别设备进行考勤。
员工将首先单击设备上的“输入”或“输出”,然后再按下设备的手指,以了解设备是在(上午)还是在(下午)输入 问题: 一些员工错误地点击设备上的“OUT”按钮,并在签到时按下手指,将其注册为OUT(AM)。。反之亦然,在(PM)中 以下是供参考的样本数据:
一名员工打了“出局”,但时间被视为凌晨“进入”。下午离开办公室时打电话进来 问题: 使用SQL(SQL Server),如何交换它们的支票类型 谢谢大家
更新考勤集checkType='IN'其中LogTime介于和之间
Update attendance set checkType = 'IN' where LogTime between <min range> and <max range>
为早上的时间设定一个范围,类似于结帐。我的策略是为每对员工记录分配一个行号。但是,我们根据日志时间和检查类型分配行号排序。如果顺序正确,则按日期升序查看给定的员工记录对,两个行号都应处于锁定步骤,如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
如果员工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的演示:
如果有人离开一个小时回来怎么办?也就是说,在同一天进进出出?他们只在中午之前进进出出,这是绝对确定的吗?@jarlh我有一个密码,先进后出。除了我上面提到的问题外,它工作得很好:(除了使用SQLServer的T-SQL编写SQL过程来交换值之外,我看不到其他方法,就像编写一个程序来交换a和B之间的值一样(将a分配给临时变量,然后将a分配给B,将临时分配给a)@BeanFrog该公司使用该设备已有数十年。因此,假设我是进行调整的人。悲惨的生活。哇……我从未想过!我会尝试一下,希望能接受这个答案。谢谢!没问题:)同样,你也会在结账时使用它。我不确定这在所有情况下都能奏效。这不会将
OUT
分配给任何对象。例如,如果员工上班很晚,然后很快离开,这可能会失败。或者,我可以使用RIGHT(LogTime,2)来确定是上午还是下午。。然后更新相应的checkType。在我的情况下,它起作用了。除非我们公司每天24小时营业,否则情况可能会很糟。。删除已接受的答案。。我忘了员工有时半天上班。。在PM或AM(例如1PM-6PM)上输入和输出消息102,级别15,状态1,第9行“t”附近的语法不正确。我从更新中删除了别名。请再试一次。它能工作。。但结果是错误的。。AM/PM与IN/OUWAIT随机混合。。。您没有将文本存储到LogTime
,是吗?当然不可能。您将需要转换为某种日期类型,我不确定这是否可以实现。我尝试了CONVERT()
,但失败了。
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
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