我有 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周日的另一个记录。
我想弄清楚如何得到两件事:
答案 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)
我没有测试过这些查询,因此可能需要进行一些调整。