SQL Server 2008中的更新列
问题描述:
在下表中,我想根据比较下一个记录时间和当前记录时间之间的差异来更新BreakTime。SQL Server 2008中的更新列
我曾尝试此查询:
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)
但它抛出一个错误
子查询返回多个值。当子查询遵循=,!=,<,< =,>,> =或当子查询用作表达式时,这是不允许的。
答
既然你在你的表有行号,你可以自我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)
+0
虽然这个代码片断是值得欢迎的,并可以提供一些帮助,这将是[极大,如果提高包括* how *和* why *的解释](// meta.stackexchange.com/q/114762)解决了这个问题。请记住,你正在为将来的读者回答这个问题,而不仅仅是现在问的人!请编辑您的答案以添加解释,并指出适用的限制和假设。 –
谢谢蒂姆,是否有可能更新时间格式的差异像00:00:02(hh:mm:ss).. – Vengat
@Vengat我更新了我的答案,我认为在这种情况下会起作用。 –
这是完美的作品... – Vengat