Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-交换/交换字段值_Sql_Sql Server - Fatal编程技术网

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