【问题标题】:SQL determine schedule availabilitySQL 确定计划可用性
【发布时间】:2016-02-24 17:46:49
【问题描述】:

我有一个 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. 给定开始日期和结束日期,找到所有 适用的可用期限。

【问题讨论】:

  • 当您说“同一天可以有多个记录”时,您的意思是同一 id?

标签: sql-server resource-scheduling


【解决方案1】:

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

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)

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

【讨论】:

  • 不确定您是否理解正确。 startdate 和 enddate 是这些记录有效的时间,重叠冲突需要同时检查 startdate/enddate 和 fromtime/totime。举个例子,如果有两条记录,一条是 startdate Jan 1 和 end date Jan 10,第二个是 startdate Jan 20 和 enddate Jan 31 并且都有 fromtime 10:00 和 totime 12:00 这不是问题,因为它们是不同时期。可用性问题也是如此。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-14
  • 2020-05-13
  • 2023-01-20
相关资源
最近更新 更多