SQL - 操作数数据类型datetime2对于减法运算符无效。

5
我希望从下面的列中,用第二行减去第一行的 _timestamp 值。在我的数据中,_number 是排序列。

enter image description here

并将结果放入一个名为diff的新列中。我已经尝试使用以下查询:

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,级别16,状态1,第4行
操作数数据类型datetime2无法用于减法运算符。

如果有任何提示将不胜感激。我有一个巨大的记录,我想自动应用到整个列中。我正在使用SQL Sever 2008。

2
请查看datediff函数 https://msdn.microsoft.com/zh-cn/library/ms189794.aspx - Serg
使用datediff函数 https://msdn.microsoft.com/zh-cn/library/ms189794.aspx 你只需要两行还是所有记录? - McNets
不,我想将其应用于所有记录(约30万行)。 - Desta Haileselassie Hagos
2个回答

8

正如评论中提到的那样,您不能使用-运算符减去时间戳。请改用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

编辑:根据原始问题中的评论,要更新名为diff的列,
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;

你的意思是用上面查询的结果更新“diff”列吗? - Vamsi Prabhala
1
@DestaHaileselassieHagos..看一下修改..你可以使用cte进行更新。 - Vamsi Prabhala

1

使用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.

但是当转换为datetime时,它会给出一个不错的结果 ;-)

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接