2017-02-14 134 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)解決了這個問題。請記住,你正在爲將來的讀者回答這個問題,而不僅僅是現在問的人!請編輯您的答案以添加解釋,並指出適用的限制和假設。 –