计算行对之间的时间差

时间:2015-02-10 13:40:52

标签: sql-server sql-server-2008-r2

我有这样的数据库记录:

Connected                 UpdatedTime
1                         2015-02-05 13:13:23.420
0                         2015-02-05 23:40:50.360
1                         2015-02-05 23:40:50.357
0                         2015-02-05 23:34:41.250

1是我将外部设备连接到PC时,0是我断开它的时候。 我想知道连接usb设备的秒数以及断开连接的秒数。

我的问题:

我可以使用MSSQL查询吗?

1 个答案:

答案 0 :(得分:1)

我调整了这些值,使结果比样本数据中的数千秒更有意义(并且可验证)。我使用自加入递归cte来执行DATEDIFF计算,如下所示:

SQL Fiddle

MS SQL Server 2008架构设置

CREATE TABLE USBConnections
    ([Connected] int, [UpdatedTime] datetime)
;

INSERT INTO USBConnections
    ([Connected], [UpdatedTime])
VALUES
    (1, '2015-02-05 13:00:00'),
    (0, '2015-02-05 13:00:50'),
    (1, '2015-02-05 14:00:50'),
    (0, '2015-02-05 14:00:55')
;

查询1

请注意,递归cte会根据行号-1小于当前行并且状态在10之间切换而加入自身。

;WITH cte AS
(
SELECT [Connected], [UpdatedTime], 
       ROW_NUMBER() OVER ( ORDER BY [UpdatedTime]) rownum
FROM USBConnections
)
SELECT SUM(DATEDIFF(SECOND, cte1.[UpdatedTime], cte2.[UpdatedTime]) ) ConnectedTime
FROM    cte cte1
INNER JOIN cte cte2 ON cte1.rownum = cte2.rownum - 1 
      AND (cte1.Connected = 1 AND cte2.Connected = 0)

<强> Results

| CONNECTEDTIME |
|---------------|
|            55 |

<强>参考:

Recursive Queries Using Common Table Expressions (CTE)