I want to subtract the value of the first row from the value of the second row of column _timestamp
(shown below). _number
is the ordering column i
It's indeed not feasible with the datetime2
DECLARE @t1 DATETIME2(7) = '2020-01-01 13:20:00.000'
DECLARE @t2 DATETIME2(7) = '2020-01-01 13:22:23.000'
SELECT CONVERT(VARCHAR(50),@t2 - @t1, 108)
>> Operand data type datetime2 is invalid for subtract operator.
But when converted to a datetime
, it gives a nice result ;-)
DECLARE @t1 DATETIME2(7) = '2020-01-01 13:20:00.000'
DECLARE @t2 DATETIME2(7) = '2020-01-01 13:22:23.000'
SELECT CONVERT(VARCHAR(50), CONVERT(DATETIME, @t2) - CONVERT(DATETIME, @t1), 108)
>> 00:02:23
As mentioned in the comments, you can't subtract timestamps with -
operator. Use DATEDIFF
function instead.
To get the difference of the current row and the next row's timestamps, use 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
Edit: To update
a column named diff per the OP's comment,
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;