1

我有一个tbl_availability来确定资源何时可用。表结构为:

id - running id
startdate - when this availability starts
enddate - when this availability ends
dayofweek - weekday of availability
fromtime - start time
totime - end time

同一天可以有多条记录,例如,一条记录用于星期日 1000-1200,另一条记录用于星期日 1300-1400。

我想弄清楚如何得到两件事:

  1. 在输入新记录时检查与现有记录没有冲突(重叠)
  2. 给定开始日期和结束日期,找到所有适用的可用时间段。
4

1 回答 1

0

要确定是否存在冲突,此查询将返回任何重叠的时间范围:

SELECT * FROM tbl_availability 
WHERE (startDate > @CheckEnd AND startDate <= @CheckStart)
OR (endDate < @CheckStart AND endDate >= @CheckEnd)
OR (startDate >= @CheckStart AND endDate <= @CheckEnd)

where 子句的第一部分检查与开始时间重叠的任何内容。第二部分检查与结束时间重叠的任何内容。第三部分检查范围内的任何内容。

要检查指定持续时间的可用时间范围,请使用以下命令:

SELECT * FROM
(SELECT endDate AS PeriodStart, (SELECT TOP 1 startDate 
  FROM tbl_availability as sub
  WHERE sub.startDate > tbl_availability.endDate
  ORDER by sub.startDate) AS PeriodEnd
FROM tbl_availability) AS OpenPeriods
WHERE DateDiff(MINUTE, PeriodStart, PeriodEnd) >= DateDiff(MINUTE, @RangeStart, @RangeEnd)

我还没有测试过这些查询,所以这里可能需要进行一些调整。

于 2016-02-24T18:53:34.807 回答