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

Sql 查询跨越月边界的事件的月总小时数,sql,sql-server,Sql,Sql Server,我有一系列独特的事件,可能会持续任意时间。我需要计算活动的小时数对每月总数的贡献,因为活动可能在特定月份之前开始,在这种情况下,它将对前一个月以及当前月份作出贡献,并在特定月份之后结束 数据如下所示: Event | StartDate | EndDate | ------------------------------- | 1 | 10/01/2015| 11/01/2015| | 2 | 20/12/2014| 9/01/2015 | | 3 | 25/01/2015| 1

我有一系列独特的事件,可能会持续任意时间。我需要计算活动的小时数对每月总数的贡献,因为活动可能在特定月份之前开始,在这种情况下,它将对前一个月以及当前月份作出贡献,并在特定月份之后结束

数据如下所示:

Event | StartDate | EndDate   |
-------------------------------
| 1   | 10/01/2015| 11/01/2015|
| 2   | 20/12/2014| 9/01/2015 |
| 3   | 25/01/2015| 14/02/2015|
最后,我将尝试生成一个按月份和年份分组的列表,该列表将汇总每个月的事件小时数,而不是每个事件-对该月内的事件进行汇总


老实说,我甚至不知道从哪里开始。最简单的方法是使用月份表,因为你可以有空的月份

create table months (
   month_id integer,
   date_ini datetime,
   date_end datetime
) 
然后你和你的桌子做一个连接

你有4箱

开始和结束在月份内的事件 结束时间超过月末的事件 事件在一个月之前开始,在一个月之后结束 没有任何事件的一个月。 试试看。这会奏效的

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

这是你的电话号码

我不知道我是否理解-你的意思是将事件表与月份表连接起来,这样联盟就是一个可能重复的事件列表,用于跨国界的事件以及它们在每个月内消耗的时间?我刚刚完成了它…在第二行中,事件2将在20日开始,在31日结束记录,然后从第1个月开始,到下一个月的第9个月结束。我认为可能需要一个案例切换来设置月休息时间,或者如果完成,现在只需要每月的SUMhours\u id。。。看看2015-01-20到2015-02-09如何在1月31日之前的11天内提供264小时这真的很有帮助-我会做一些测试并更新你。你的日期字段是日期还是日期时间??因为如果你想现在计算小时数,所有的时间都是24小时,结束日期就没有意义了。它是虚拟值吗?。结束日期应大于开始日期事件开始日期结束日期| 2 | 20/12/2015 | 9/01/2015 |我的错误-我会更正它汉克-也会尝试此方法我不认为这会考虑到您可能在一个月内只计算事件的一部分?
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