繁体   English   中英

如何在SQL中计算累积时差

[英]How to Calculate Cumulative time difference in sql

我想在sql显示累积时差。 这是时间戳列。 时间差应为累积形式,而不使用临时表,但对于id我们可以使用ROW_NUMBER()

Timestamp
2015-05-20 11:23:34.853
2015-05-20 11:21:40.790
2015-05-20 11:20:12.447
2015-05-20 11:19:31.723
2015-05-20 11:19:10.993

结果应该是这样的:

TimeDifference
00:00:00
00:01:54
00:01:28
00:00:41
00:00:21

您可以将DATEDIFFCONVERT to Time结合使用,并基于时间戳的顺序进行自连接来实现此目的。 像这样(对于SQL Server 2008)。

;WITH cte as 
(
select '2015-05-20 11:23:34.853' ts
union all select '2015-05-20 11:21:40.790'
union all select '2015-05-20 11:20:12.447'
union all select '2015-05-20 11:19:31.723'
union all select '2015-05-20 11:19:10.993'
), cte2 as 
(
SELECT *,ROW_NUMBER()OVER(ORDER BY ts DESC) rn
FROM cte
)
select t1.ts,t2.ts,CONVERT(TIME,DATEADD(s,ISNULL(DATEDIFF(s,t1.ts,t2.ts),0),0)) diff
from cte2 t1 LEFT JOIN cte2 t2 on t1.rn = t2.rn + 1

产量

ts  ts  diff
2015-05-20 11:23:34.853 NULL    00:00:00.0000000
2015-05-20 11:21:40.790 2015-05-20 11:23:34.853 00:01:54.0000000
2015-05-20 11:20:12.447 2015-05-20 11:21:40.790 00:01:28.0000000
2015-05-20 11:19:31.723 2015-05-20 11:20:12.447 00:00:41.0000000
2015-05-20 11:19:10.993 2015-05-20 11:19:31.723 00:00:21.0000000

如果您使用的是SQL 2012,则可能使用过LAG / LEAD就像这样

SELECT CONVERT(TIME,DATEADD(s,ISNULL(DATEDIFF(s,ts,LAG(ts)over(order by ts DESC)),0),0))
FROM cte
ORDER BY ts DESC

您可以为行编号,然后用left join联接计算差值:

DECLARE @t TABLE ( d DATETIME )

INSERT  INTO @t
VALUES  ( '2015-05-20 11:23:34.853' ),
        ( '2015-05-20 11:21:40.790' ),
        ( '2015-05-20 11:20:12.447' ),
        ( '2015-05-20 11:19:31.723' ),
        ( '2015-05-20 11:19:10.993' );

WITH    cte
          AS ( SELECT   d ,
                        ROW_NUMBER() OVER ( ORDER BY d DESC ) AS rn
               FROM     @t
             )
    SELECT  CAST(ISNULL(c2.d - c1.d, 0) AS TIME(0)) TimeDifference
    FROM    cte c1
            LEFT JOIN cte c2 ON c2.rn + 1 = c1.rn

输出:

TimeDifference
00:00:00
00:01:54
00:01:28
00:00:41
00:00:21

但是请注意,时间类型最多可以保留24小时。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM