使用SQL(或T-SQL),如何从记录设置值的日期和时间的表中获取每小时0或1的值的时间长度?

时间:2016-12-18 14:56:34

标签: sql-server sql-server-2008 datetime

我有一张包含以下数据的表格:

        StartTime                     Value
 ----------------------------------------------    
    2016-12-20 08:09:00                 1
    2016-12-20 09:53:00                 0
    2016-12-20 11:10:21                 1
    2016-12-20 11:30:00                 1
    2016-12-20 12:20:30                 0
    ....                              ....
    ....                              ....
    2016-12-20 23:44:10                 1
    2016-12-21 00:33:00                 0
    2016-12-21 01:05:05                 0

所以,我想要做的是找出每小时的值为0或1的时间,其中小时为00:00:00 - 01:00:00,然后是01:00:00 - 02:00:00 ... 23:00:00 - 00:00:00 我想要实现的目标如下:

    HourStart                 Period Value Was 0       Period Value Was 1
--------------------------------------------------------------------------
2016-12-20 00:00:00                 50 min                   10 min
2016-12-20 01:00:00                  30                        30
2016-12-20 02:00:00                  32                        28
2016-12-20 03:00:00                  60                        00
2016-12-20 04:00:00                  21                        39
....                                ....                      ....
....                                ....                      ....
2016-12-20 21:00:00                  30                        30
2016-12-20 22:00:00                  20                        40
2016-12-20 23:00:00                  10                        50
2016-12-21 00:00:00                  01                        59
2016-12-21 01:00:00                  30                        30
....                              ....

顺便说一下,我正在使用Microsoft Transact-SQL。 感谢。

1 个答案:

答案 0 :(得分:0)

以下是一种方法:

首先,创建并填充样本表(在将来的问题中保存此步骤)

DECLARE @T as TABLE
(
    startTime datetime,
    value int
)

INSERT INTO @T VALUES
('2016-12-20 08:09:00', 1),
('2016-12-20 09:53:00', 0),
('2016-12-20 11:10:21', 1),
('2016-12-20 11:30:00', 1),
('2016-12-20 12:20:30', 0),
('2016-12-20 23:44:10', 1),
('2016-12-21 00:33:00', 0),
('2016-12-21 01:05:05', 0)

然后,使用几个公用表表达式 - 一个用于删除开始时间的分钟和秒,第二个用于获取上一行的开始时间:

;WITH cte1 as
(
    SELECT  StartTime, 
            value, 
            DATEADD(SECOND, -DATEPART(SECOND, startTime), DATEADD(MINUTE, -DATEPART(MINUTE, startTime), startTime)) As startHour
    FROM @T 
), cte2 as
(
    SELECT  StartTime, 
            value, 
            StartHour, 
            DATEDIFF(MINUTE, ISNULL(LAG(startTime) OVER(Partition by startHour ORDER BY startTime), startHour), startTime) As minutes
    FROM cte1
)

然后,从第二个cte中选择:

SELECT  startHour,
        value, 
        CASE WHEN value = 1 THEN
            minutes 
        ELSE
            60 - minutes 
        END as minutes_1,
        CASE WHEN value = 0 THEN 
            minutes 
        ELSE 
            60 - minutes 
        END as minutes_0
FROM cte2

结果:

startHour               value   minutes_1   minutes_0
20.12.2016 08:00:00     1       9           51
20.12.2016 09:00:00     0       7           53
20.12.2016 11:00:00     1       10          50
20.12.2016 11:00:00     1       20          40
20.12.2016 12:00:00     0       40          20
20.12.2016 23:00:00     1       44          16
21.12.2016 00:00:00     0       27          33
21.12.2016 01:00:00     0       55          5
相关问题