2017-02-14 92 views
2

在下表中,我想根据比较下一个记录时间和当前记录时间之间的差异来更新BreakTime。SQL Server 2008中的更新列

enter image description here

我曾尝试此查询:

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) 

但它抛出一个错误

子查询返回多个值。当子查询遵循=,!=,<,< =,>,> =或当子查询用作表达式时,这是不允许的。

回答

3

既然你在你的表有行号,你可以自我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为升序排列)处理表中的最后一条记录的边缘情况。在这种情况下,它不会与任何记录匹配,因此我选择在此情况下报告零中断时间。

如果您BreakTimeTime类型,那么你可以只使用DATEADD()设置时间:

SET BreakTime = DATEADD(SECOND, 
         DATEDIFF(SECOND, t1.Time, COALESCE(t2.Time, t1.Time)), 
         '00:00:00') 
+0

谢谢蒂姆,是否有可能更新时间格式的差异像00:00:02(hh:mm:ss).. – Vengat

+0

@Vengat我更新了我的答案,我认为在这种情况下会起作用。 –

+1

这是完美的作品... – Vengat

0
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) 
+0

虽然这个代码片断是值得欢迎的,并可以提供一些帮助,这将是[极大,如果提高包括* how *和* why *的解释](// meta.stackexchange.com/q/114762)解决了这个问题。请记住,你正在为将来的读者回答这个问题,而不仅仅是现在问的人!请编辑您的答案以添加解释,并指出适用的限制和假设。 –