2017-02-14 11 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並び順昇順として)テーブル内の最後のレコードのエッジケースを扱うことです。この場合、それはどのレコードとも一致しないので、私はこの場合にブレーク時間のゼロを報告することを選択します。

あなたBreakTime列がTimeタイプであれば、あなただけの時間を設定するためにDATEADD()を使用することができます。このコードスニペットは大歓迎であるが

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

ありがとうございましたTim、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

を、そしていくつかの助けを提供することができる、それが[大幅にそれた場合に改善されるだろう(* meta.stackexchange.com/q/114762)* how * and * why *これが問題を解決します。あなたが今質問している人だけでなく、将来読者のための質問に答えていることを忘れないでください!説明を追加するためにあなたの答えを[編集]し、どんな制限と前提が適用されるかを示してください。 –

関連する問題