Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-操作数数据类型datetime2对于减法运算符无效_Sql_Sql Server 2008 - Fatal编程技术网

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

SQL-操作数数据类型datetime2对于减法运算符无效,sql,sql-server-2008,Sql,Sql Server 2008,我想从列\u timestamp的第二行的值中减去第一行的值(如下所示)\u编号是我的数据中的排序列 并将结果放入名为diff的新列中。我尝试了以下查询 use dbtest select t2._number, t2._timestamp, coalesce(t2._timestamp - (select t1._timestamp from dbo.tcp t1 where t1._number = t2.

我想从列
\u timestamp
的第二行的值中减去第一行的值(如下所示)<代码>\u编号是我的数据中的排序列

并将结果放入名为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 Server 2008。

如评论中所述,您不能使用
-
运算符减去时间戳。改用
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
编辑:根据OP的评论更新名为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;

使用
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.
但是当转换为
日期时间时,它会给出一个很好的结果;-)


请参阅datediff函数使用datediff您只需要两行还是所有记录?不,我想将其应用于所有记录(大约300000行)您的意思是使用上述查询的结果更新
diff
列吗?@DestaHaileselassieHagos。。请参阅编辑。您可以使用cte进行更新。
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