如何计算时间戳列表之间的持续时间
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);
我有一个带有时间戳列表的 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);