我有一个包含Begindate (datetime)和Enddate (datetime)的数据库表。此表包含活动持续时间。现在,我正在尝试创建一个函数,根据指定的开始-结束日期内不重叠的活动来计算总持续时间。
如下所示:
我正在调用这个函数,给出参数: Begindate='2012-08-16 10:00‘Enddate='2012-08-16 18:00’
现在,假设表中有以下数据:
现在我希望发生以下事情:
返回的总时间为:6小时30分钟。
如果有人能在这方面帮助我,我将非常感激!)
发布于 2012-08-16 09:48:44
可能更容易计算缺失范围,然后从完整期间减去持续时间:
declare @begindate datetime = '20120816 10:00:00'
declare @enddate datetime = '20120816 18:00:00'
; with supplement as (
select begindate, enddate
from daterangetable
-- overlapping ranges only
where begindate <= @enddate
and enddate >= @begindate
union all
-- empty start range to catch missing start intervals
select @begindate, @begindate
union all
-- empty end range to catch missing end intervals
select @enddate, @enddate
)
select datediff (minute, @begindate, @enddate)
- sum (datediff (minute, gapStart, gapEnd)) Minutes
from
(
select max(d2.enddate) gapStart,
d1.begindate gapEnd
from supplement d1
cross join supplement d2
-- d2 range must start before d1 range
where d2.begindate < d1.begindate
group by d1.begindate
-- Range is completely covered if d2 ends after d1 begins
-- so it should be removed
having max(d2.enddate) < d1.begindate
) missingRanges如果第一次结束是在第二次开始之后,那么第一次开始是在第二次结束之前。请参阅链接以获得(更好的)解释。
如果不使用Server 2005或更高版本,则需要将with中的代码移动到派生表中以补充d1和补充d2。
下面是Sql示例。
https://stackoverflow.com/questions/11982500
复制相似问题