我有一系列独特的事件,可能会持续一段时间。我需要计算事件对每月总计的贡献时间,因为事件可能在特定月份之前开始(在这种情况下它将对上个月和当前月份做出贡献)并在特定月份之后结束。
数据类似于:
Event | StartDate | EndDate |
-------------------------------
| 1 | 10/01/2015| 11/01/2015|
| 2 | 20/12/2014| 9/01/2015 |
| 3 | 25/01/2015| 14/02/2015|
最终,我尝试生成按月和年分组的列表,总计每个月的“活动时间”(不是每个事件 - 月内的事件总和)。
说实话,我甚至不知道从哪里开始。
答案 0 :(得分:1)
简单的方法是使用月表,因为你可以有空月。
create table months (
month_id integer,
date_ini datetime,
date_end datetime
)
然后你加入你的桌子。
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。