组合时间戳按1小时的inervals计算,并将其余时间加到下一小时

时间:2017-05-25 03:18:53

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

我喜欢这个网站找到我的查询的解决方案,但现在我找不到任何问题的解决方案

我有这张桌子:

START_TIME          END_TIME              GROUP_DATE        GROUP_ID
24-04-2017 13:15    24-04-2017 13:28      24-04-2017        1
24-04-2017 14:01    24-04-2017 15:04      24-04-2017        1
24-04-2017 15:04    24-04-2017 20:00      24-04-2017        1
24-04-2017 20:00    24-04-2017 21:35      24-04-2017        2
25-04-2017  0:10    25-04-2017  1:25      25-04-2017        2

我正试图解决这个问题:

date          Hour    dec_hour  GROUP_ID
...
24-04-2017    10      0         1
24-04-2017    11      0         1
24-04-2017    12      0         1
24-04-2017    13      0.22      1
24-04-2017    14      0.98      1
24-04-2017    15      1         1
24-04-2017    16      1         1
24-04-2017    17      1         1
24-04-2017    18      1         1
24-04-2017    19      1         1
24-04-2017    20      1         1
24-04-2017    21      0.59      2
24-04-2017    22      0         2
24-04-2017    23      0         2
25-04-2017    00      0.83      2
25-04-2017    01      0.41      2
25-04-2017    02      0         2
25-04-2017    03      0         2
...

正如你所看到的那样,小时是按照60分钟的间隔减少,其余时间是加到下一个小时,我可以建立一个tmep表并插入记录,但我不知道如何分割跨度小时

我不知道我是否对此有点接近:

select CAST(start_time AS Date) as LogDate
, datepart(hh, start_time) as Hour
, SUM ( isnull (DATEDIFF(s,START_TIME,END_TIME),0)) as Entries

FROM MY_DAM_TABLE
WHERE ...

Group By CAST(start_time AS Date)
, datepart(hh, start_time)

=

LogDate     Hour    minuts
2017-05-24  13      780
2017-05-24  14      3774
2017-05-24  15      17731
2017-05-24  20      5710

请,任何提示将不胜感激

感谢

1 个答案:

答案 0 :(得分:0)

您可以使用计数小时表和OUTER APPLY这样的

DECLARE @SampleData AS TABLE
(
    START_TIME datetime, 
    END_TIME datetime,
    GROUP_DATE date,
    GROUP_ID int
)

INSERT INTO @SampleData
VALUES
('2017-04-24 13:15', '2017-04-24 13:28', '2017-04-24', 1),
('2017-04-24 14:01', '2017-04-24 15:04', '2017-04-24', 1),
('2017-04-24 15:04', '2017-04-24 20:00', '2017-04-24', 1),
('2017-04-24 20:00', '2017-04-24 21:35', '2017-04-24', 2),
('2017-04-25  0:10', '2017-04-25  1:25', '2017-04-25', 2)

DECLARE @StartHour datetime , @EndHour datetime

SELECT  @StartHour = min(sd.GROUP_DATE), 
       @EndHour = dateadd(day, 1, max (sd.GROUP_DATE))
FROM @SampleData sd


-- temp returns all hours from @StartHour And @EndHour
;WITH temp AS
(
    SELECT @StartHour AS StartHour, dateadd(hour,1,@StartHour) AS EndHour
    UNION ALL
    SELECT dateadd(hour,1,t.StartHour), dateadd(hour,2,t.StartHour)
    FROM temp t
    WHERE t.StartHour < dateadd(hour, -1 ,@EndHour)
)
SELECT  CAST(t.StartHour AS date) AS Date,
       datepart(hour,t.StartHour) AS Hour,
       CAST(ISNULL(SUM(datediff(minute,a.ActualStartTime,a.ActualEndTime) ),0) AS decimal(10,2))/60 AS dec_hour ,
       min(a.GROUP_ID) AS Group_Id
FROM temp t
OUTER APPLY
(
    SELECT  CASE WHEN sd.START_TIME > t.StartHour THEN START_TIME ELSE t.StartHour END as ActualStartTime,
          CASE WHEN sd.END_TIME > t.EndHour THEN t.EndHour  ELSE sd.END_TIME END as ActualEndTime,
          sd.GROUP_ID
    FROM @SampleData sd   
    WHERE t.StartHour BETWEEN sd.START_TIME AND sd.END_TIME
         OR (t.EndHour BETWEEN sd.START_TIME AND sd.END_TIME)
        OR (sd.START_TIME BETWEEN t.StartHour AND t.EndHour)
        OR (sd.END_TIME BETWEEN t.StartHour AND t.EndHour)
) a
GROUP BY t.StartHour
OPTION (MAXRECURSION 0)

演示链接:http://rextester.com/HFXKL42797