繁体   English   中英

SQL Server 2008中的“更新”列

[英]Update column in SQL Server 2008

在下表中,我想基于比较下一个记录时间和当前记录时间之间的差异来更新BreakTime。

在此处输入图片说明

我已经尝试过以下查询:

update Machine_Data 
set BreakTime = (select DATEDIFF(SECOND, M2.Time, M1.Time) as BreakTime 
                 from Machine_Data M1 
                 join Machine_Data M2 on M1.DocEntry = M2.DocEntry + 1) 

却抛出一个错误

子查询返回的值超过1。 当子查询遵循=,!=,<,<=,>,> =或将子查询用作表达式时,不允许这样做。

由于表中有行号,因此您可以在UPDATE期间自行加入以适当地排列时间。 请注意,连接条件是当前DocEntry应该与其在连接表中的一个匹配。

UPDATE t1
SET BreakTime = DATEDIFF(SECOND, t1.Time, COALESCE(t2.Time, t1.Time))
FROM Machine_Data t1
INNER JOIN Machine_Data t2
    ON t1.DocEntry = t2.DocEntry - 1

另一个要注意的是,对COALESECE()的调用将处理表中最后一条记录的边缘情况(按DocEntry升序排序)。 在这种情况下,它不会与任何记录匹配,因此在这种情况下,我选择报告零休息时间。

如果BreakTime列是Time类型,则可以使用DATEADD()设置时间:

SET BreakTime = DATEADD(SECOND,
                        DATEDIFF(SECOND, t1.Time, COALESCE(t2.Time, t1.Time)),
                        '00:00:00')
update Machine_Data
set BreakTime = (select MAX(DATEDIFF(SECOND,M2.Time,M1.Time)) as BreakTime
                 from Machine_Data M1 join Machine_Data M2 on M1.DocEntry =M2.DocEntry+1)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM