如何计算时间戳列表之间的持续时间

How to calculate duration between a list of timestamps

我有一个带有时间戳列表的 table,我想计算时间戳之间的持续时间 Table 列表如下所示

我的时间
2015-01-30-08.12.51.141000
2015-01-30-08.12.51.142000
2015-01-30-08.12.51.142000
2015-01-30-08.12.51.162000
2015-01-30-08.12.51.170000
2015-01-30-08.12.51.290000

我想要的结果集是

第一个时间戳 下一个时间戳持续时间(以微秒为单位)
2015-01-30-08.12.51.141000 2015-01-30-08.12.51.142000 1000
2015-01-30-08.12.51.142000 2015-01-30-08.12.51.142000 0000
2015-01-30-08.12.51.142000 2015-01-30-08.12.51.162000 20000

我正在为我使用 DB2 SQL,但不确定如何使用 pivot table 或 CTE?

我没有 DB2 数据库,但知道 DB2 也有一个 ROW_NUMBER() 函数。所以你可以尝试应用以下方法...(它适用于 MS SQL)

CREATE TABLE #temp (dt datetime);

INSERT INTO #temp 
SELECT getutcdate() 
UNION ALL 
SELECT dateadd(ms, 7, getutcdate())
UNION ALL 
SELECT dateadd(s, 1, getutcdate())
UNION ALL 
SELECT dateadd(s, 3, getutcdate());

SELECT t1.dt as datetime1, t2.dt as datetime2, DATEDIFF(ms, t1.dt, t2.dt) as diff
FROM (SELECT dt, ROW_NUMBER() OVER(ORDER BY dt)+1 as rn FROM #temp) t1
INNER JOIN (SELECT dt, ROW_NUMBER() OVER(ORDER BY dt) as rn FROM #temp) t2
ON t1.rn = t2.rn

DROP TABLE #temp;

结果:

datetime1   datetime2   diff
2015-01-30 20:57:59.053 2015-01-30 20:57:59.060 6
2015-01-30 20:57:59.060 2015-01-30 20:58:00.053 993
2015-01-30 20:58:00.053 2015-01-30 20:58:02.053 2000

这取决于您使用的 SQL 服务器。它是否实现了 Window 功能?

行间操作。上一个和下一个时间戳差异。

2008 年 SQL 女士:

WITH AUXILIERY_TBL AS (
    SELECT 
      A.[Time_Stamp]
     ,ROW_NUMBER() OVER (ORDER BY A.[Time_Stamp]) AS Ordr
      FROM [Time_Stamps_TBL] AS A
)

SELECT 
 A.[Time_Stamp] 
,DATEDIFF(MINUTE ,B.[Time_Stamp] ,A.[Time_Stamp] ) AS Duration_Minutes
FROM AUXILIERY_TBL AS A
LEFT JOIN AUXILIERY_TBL AS B
       ON (A.Ordr=(B.Ordr+1))

在 MS SQL 2012/14 中,不需要临时 table:

SELECT
 A.[Time_Stamp]
,DATEDIFF(MINUTE, (LAG(A.[Time_Stamp]) OVER (ORDER BY A.[Time_Stamp])), A.[Time_Stamp]) AS Duration_Minutes
FROM [Time_Stamps_TBL] AS A

您可以将 DATEDIFF 函数从分钟更改为小时或秒,哪个更适合您。

这是我的 DB2 解决方案: 我有一个 table,其中有一列填充了标签和时间戳; 首先,我创建了一个 CTE 来过滤我想要的记录,然后我取出了标签和时间戳以及一个新创建的排名列。 然后使用这个 CTE table 我使用排名加入 1 到 2 然后 2 到 3 等来获得我的持续时间。 *感谢 Milan 带我走向正确的方向。

将 TagTimeTable (myTag, myTime, myRank) 作为 (Select substring(SPOOLRCD FROM 34 FOR 6) AS mytag, CAST(substring(SPOOLRCD FROM 60 FOR 26) AS TIMESTAMP) AS mytime, ROW_NUMBER() OVER(ORDER BY substring(SPOOLRCD FROM 60 FOR 26)) 作为我的军衔 来自 MYLIB.SPOOLTBL WHERE SPOOLRCD LIKE '%DSPLY%' 按我的时间订购 )

SELECT cast('0001-01-01 00:00:00.000' 作为时间戳) + TIMESTAMPDIFF(1, CHAR(time2.myTime - time1.myTime)) MICROSECOND作为 TIME_IN_MICROSECONDS, TIME1.MYTIME, TIME2.MYTIME 从 标记时间表 TIME1 内部联接 标记时间表 TIME2 ON (TIME1.myRank=TIME2.myRank-1);