【问题标题】:SQL - Operand data type datetime2 is invalid for subtract operatorSQL - 操作数数据类型 datetime2 对减法运算符无效
【发布时间】:2017-08-11 23:55:08
【问题描述】:

我想从_timestamp列的第二行的值中减去第一行的值(如下所示)。 _number 是我数据中的排序列。

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

但我收到以下错误。

消息 8117,第 16 层,状态 1,第 4 行
操作数数据类型 datetime2 对减法运算符无效。

任何提示将不胜感激。我有一个巨大的记录,我想自动将它应用于整个列。我使用的是 SQL Sever 2008。

【问题讨论】:

标签: sql sql-server-2008


【解决方案1】:

如 cmets 中所述,您不能使用 - 运算符减去时间戳。请改用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 的评论命名为 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 列吗?
  • @DestaHaileselassieHagos .. 查看编辑..您可以使用 cte 进行更新。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    • 2022-01-07
    相关资源
    最近更新 更多