SQL确定计划可用性

时间:2016-02-24 17:46:50

标签: sql-server resource-scheduling

我有 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. 鉴于startdate和enddate,找到所有的 适用的可用期限。

1 个答案:

答案 0 :(得分: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)

我没有测试过这些查询,因此可能需要进行一些调整。