2017-03-20 114 views
0

最初の行の値を列_timestampの2番目の行の値から差し引きたい(下記参照)。 _numberは私のデータの注文列です。SQL - 減算演算子のオペランドデータ型datetime2は無効

enter image description here

差分と呼ばれる新しい列に結果を入れました。私は次のクエリで試してみました。

use dbtest 

select t2._number, t2._timestamp, 
coalesce(t2._timestamp - 
    (select t1._timestamp from dbo.tcp t1 where t1._number = t2._number + 1), t2._timestamp) as diff 
from dbo.tbl t2 

私は次のエラーが発生しています。

Msg 8117, Level 16, State 1, Line 4 
Operand data type datetime2 is invalid for subtract operator. 

ヒントがあれば幸いです。私は巨大なレコードを持っており、列全体に自動的に適用したいと思います。SQL Sever 2008を使用しています。

+2

はDATEDIFF機能https://msdn.microsoft.com/en-us/library/ms189794.aspx – Serg

+0

使用を参照してください。 datediff https://msdn.microsoft.com/en-us/library/ms189794.aspx 2行またはすべてのレコードのみが必要ですか? – McNets

+0

いいえ、すべてのレコード(約300,000行)に適用したい –

答えて

2

コメントに記載されているとおり、-演算子でタイムスタンプを減算することはできません。代わりにDATEDIFF関数を使用してください。 現在の行と次の行のタイムスタンプの差を取得するには、OUTER APPLYを使用します。

select t2._number,t2._timestamp, 
datediff(microsecond,t2._timestamp,t1._timestamp) as diff 
from dbo.tbl t2 
outer apply (select t1._timestamp 
      from dbo.tcp t1 
      where t1._number = t2._number + 1) t1 

編集:updateにOPさんのコメントあたりの差分という名前の列、

with cte as (   
select t2._number,t2._timestamp, t2.diff, 
datediff(microsecond,t2._timestamp,t1._timestamp) as diff_col 
from t t2 
outer apply (select t1._timestamp 
      from t t1 
      where t1._number = t2._number + 1) t1 
    ) 
update cte set diff=diff_col; 
+0

上記のクエリの結果で 'diff'カラムを更新することを意味しますか? –

+1

@DestaHaileselassieHagos ..編集を参照してください。更新するにはcteを使用できます。 –

関連する問題