【问题标题】:Sum a date range inside another date range对另一个日期范围内的日期范围求和
【发布时间】:2012-11-17 01:11:36
【问题描述】:

尝试在 SQL 中为以下内容编写查询:事件具有开始/结束日期/时间。 用户在特定时间可用。如何找到用户可参加特定活动的总时间?

例子:

--Event--
eventID eventStart          eventEnd
1       2012-10-10 15:00    2012-10-10 18:00

--Available--
userID  availStart          availEnd
64      2012-10-10 10:00    2012-10-10 16:00
64      2012-10-10 16:30    2012-10-10 16:40
64      2012-10-10 16:55    2012-10-10 22:00

用户有 135 分钟的空闲时间(15:00-16:00 为 60 分钟,16:30-16:40 为 10 分钟,16:55-18:00 为 65 分钟)。

一些编写 SQL 的帮助会非常有帮助,发现这个很棘手!

【问题讨论】:

  • @Mitch Wheat 我可以得到事件运行的总时间和用户可用的总时间,即SUM(DATEDIFF(MI,availStart,availEnd)),但是我不能完全弄清楚如何只计算可用条目属于事件时间(包括那些开始较早/结束时间较晚但仅计算事件内部部分的时间)。

标签: sql sql-server sql-server-2008 datetime logic


【解决方案1】:

现已测试:http://sqlfiddle.com/#!3/a4e7a/2

我假设有一个用户表。性能提升的空间很大。例如,通过添加一个 where 子句来消除不重叠的范围。如果将函数替换为可怕的 case 语句,它可能也会更快。

棘手的一点是计算两个时间跨度重叠多少的算法。我总是觉得绘制案例图片很有用:

Case 1
|------|
         |=======|

Case 2
|------|
     |======|

Case 3
|-------|
  |===|

以及顺序颠倒的等价物。

原来重叠是两个结束时间的最小值减去两个开始时间的最大值。 (如果为负,则没有重叠)。我总是必须检查所有案例以重新说服自己。

-- Function that determines how many minutes of overlap there are between two timespans
Create Function dbo.MinutesOverlap(
  @Start1 as datetime, @End1 as datetime, @Start2 as datetime, @End2 as datetime
) Returns int As
Begin
  Declare 
    @MaxStart As datetime,
    @MinEnd As datetime,
    @Ret int = 0

  Set @MaxStart = Case When @Start1 > @Start2 Then @Start1 Else @Start2 End
  Set @MinEnd = Case When @End1 > @End2 Then @End2 Else @End1 End

  If @MaxStart < @MinEnd
    Set @Ret = DateDiff(Minute, @MaxStart, @MinEnd)

  Return @Ret
End


Select
  u.UserID,
  e.EventID,
  Sum(dbo.MinutesOverlap(e.eventStart, e.eventEnd, a.availStart, a.availEnd))
From
  Event e
    Cross Join
  User u
    Left Outer Join
  Available a
    On u.UserID = a.UserID
Group By
  u.UserID, 
  e.EventID

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    相关资源
    最近更新 更多