首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >计算开始-结束日期时间的不重叠总持续时间。

计算开始-结束日期时间的不重叠总持续时间。
EN

Stack Overflow用户
提问于 2012-08-16 07:27:17
回答 1查看 387关注 0票数 1

我有一个包含Begindate (datetime)和Enddate (datetime)的数据库表。此表包含活动持续时间。现在,我正在尝试创建一个函数,根据指定的开始-结束日期内不重叠的活动来计算总持续时间。

如下所示:

我正在调用这个函数,给出参数: Begindate='2012-08-16 10:00‘Enddate='2012-08-16 18:00’

现在,假设表中有以下数据:

  1. 开始:“2012-08-15 10:00”结束“2012-08-15 14:00”(共计4小时)
  2. 开始:“2012-08-16 09:00”结束“2012-08-16 11:00”(共计2小时)
  3. 开始:“2012-08-16 10:30”结束“2012-08-16 10:45”(共计15分钟)
  4. 开始:“2012-08-16 12:00”结束“2012-08-16 16:00”(共计4小时)
  5. 开始:“2012-08-16 13:00”结束“2012-08-16 17:00”(共计4小时)
  6. 开始:“2012-08-16:30”结束“2012-08-16 16:45”(共计15分钟)
  7. 开始:“2012-08-16 17: 30”结束“2012-08-16 20:00”(共计2小时30分钟)

现在我希望发生以下事情:

  1. 第一个活动不在指定的期间内,因此不包括在内。
  2. 部分匹配,因此这将返回1小时。
  3. 活动在第二个活动中,因此不包括在内。
  4. 这段时间将包括4个小时。
  5. 时间为1小时,时间为下午4:00至5:00
  6. 活动将不包括在内。
  7. 在指定的期间内只有30分钟,因此这将包括在内。

返回的总时间为:6小时30分钟。

如果有人能在这方面帮助我,我将非常感激!)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-16 09:48:44

可能更容易计算缺失范围,然后从完整期间减去持续时间:

代码语言:javascript
运行
复制
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示例

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11982500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档