[英]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
您可以将DATEDIFF
与CONVERT
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.