查询跨越月边界的事件的每月总时数

时间:2015-08-31 05:27:22

标签: sql sql-server

我有一系列独特的事件,可能会持续一段时间。我需要计算事件对每月总计的贡献时间,因为事件可能在特定月份之前开始(在这种情况下它将对上个月和当前月份做出贡献)并在特定月份之后结束。

数据类似于:

Event | StartDate | EndDate   |
-------------------------------
| 1   | 10/01/2015| 11/01/2015|
| 2   | 20/12/2014| 9/01/2015 |
| 3   | 25/01/2015| 14/02/2015|

最终,我尝试生成按月和年分组的列表,总计每个月的“活动时间”(不是每个事件 - 月内的事件总和)。

说实话,我甚至不知道从哪里开始。

2 个答案:

答案 0 :(得分:1)

简单的方法是使用月表,因为你可以有空月。

create table months (
   month_id integer,
   date_ini datetime,
   date_end datetime
) 

然后你加入你的桌子。

SQL Fiddle Demo

WITH ranges as (
    SELECT *
    FROM 
        months m 
        LEFT JOIN events e 
            on   e.StartDate <= m.d_end
            and  e.EndDate >= m.d_begin
 ) 
SELECT r.*, 
       DATEDIFF(hour, 
                CASE 
                    WHEN StartDate > d_begin THEN StartDate
                    WHEN StartDate IS NULL THEN NULL
                    ELSE d_begin
                END, 
                CASE 
                    WHEN EndDate < d_end THEN EndDate
                    WHEN EndDate IS NULL THEN NULL
                    ELSE DATEADD(day,1,d_end)
                END) as Hours
FROM ranges r

你有4个案例

  • 一个开始和结束在一个月内的事件
  • 结束超出月末的事件
  • 一个事件在一个月之前开始和结束之后
  • 一个月没有事件。

答案 1 :(得分:0)

尝试。这将有效。

WITH EventInfo AS 
(
   SELECT EVENT, DATEDIFF(HOUR, StartDate,EndDate) AS hours,
        DATEPART(MONTH, EndDate)  AS Month,
        DATEPART(Year, EndDate)  AS Year
    FROM events
)  
SELECT Month, Year, SUM(hours) AS Total_hours
FROM EventInfo
Group By Month, Year

这是SQLFiddle