如何在添加新计划之前检查是否存在重复计划


How to Check Repeated Schedule Exists Before Adding New Schedule

我正在尝试为类建立时间表系统

时间表具有重复类型,如Daily、Weekly、Monthly。

现在我无法检查新的时间表添加是否已经存在/在另一个时间表之间等,

我表格的字段是

Class ID, 
Time [Day Schedule Time], 
Start [When Schedule Starts], 
End [When will Schedule Ends], 
Repeat [Daily, Weekly, Monthly]

虽然我尝试了这个,但它不适用于每周、每月和每年的

SELECT * 
FROM  `schedule` 
WHERE  '2015-04-09 06:17:17' <= startdt
AND  '2015-04-10 06:17:17' >= enddt
AND TYPE =  'daily'
AND (
(
'03:07:00' NOT 
BETWEEN TIME
AND endtime
)
AND (
'04:14:00' NOT 
BETWEEN TIME
AND endtime
)
AND (
TIME NOT 
BETWEEN  '04:07:00'
AND  '04:07:00'
)
)
LIMIT 0 , 30

你能澄清一下吗?当你创建一个新的时间表时,你是否正在创建所有的重复条目,并且在添加另一个重复时间表之前,你试图检查是否没有冲突?

我认为开始相当于一个日期,你的课程是固定的时间段,即1小时?所以你从时间表中解压的数据可能是这样的?(经过一些归一化简化)

日历条目日程ID教室ID日期开始时间(假设固定持续时间-如果不是,则添加结束时间

一旦时间表确定,上面的内容就会被填充,并且会容纳所有的教室、日期和时间吗?

如果你要创建一个新的时间表,你可能会将所有建议的新条目生成到一个具有相同结构的临时表中,然后:

...
IF EXISTS (
SELECT TOP 1 *
FROM #PlannedEntries A
INNER JOIN CalendarEntries B
ON A.Date = B.Date
AND A.ClassroomID = B.ClassroomID
AND ( 
A.StartTime BETWEEN B.StartTime AND DATEADD(MIN,@LessonDuration,B.StartTime)
      OR 
DATEADD(MIN,@LessonDuration,A.StartTime) BETWEEN B.StartTime AND DATEADD(MIN,@LessonDuration,B.StartTime)
     OR
(A.StartTime < B.StartTime AND DATEADD(MIN,@LessonDuration,A.StartTime) > DATEADD(MIN,@LessonDuration,B.StartTime) 
)
   PRINT 'Schedule Conflict'
ELSE
BEGIN
   PRINT 'Schedule Added'
   INSERT INTO CalendarEntries SELECT * FROM #PlannedEntries 
END

你可能也需要考虑主题和资源(员工)。添加一些澄清,我会看看我回来后是否能为你指明正确的方向;)

注意——这太乱了。我将开始和结束时间分开,你可以简化上面的内容。如果你有一个"老虎机"系统,这也要简单得多,而不是基于时间的课程。还有更好的方法来构建它-如果这是你遇到的那种问题,请告诉我,我会改进它。