如何在添加新计划之前检查重复的计划

时间:2015-04-08 13:31:47

标签: php sql-server schedule

我正在尝试为类构建计划系统

附表有重复类型,如每日,每周,每月。

现在我无法检查新计划添加是否已存在/在另一个计划等之间,

我的表单字段是

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 个答案:

答案 0 :(得分:1)

你能澄清一下吗?当您创建新计划时,您是否创建了所有重复条目,并且在添加其他重复计划之前,您是否尝试检查是否存在冲突?

我认为Start等于一个日期,你的类是固定的时间段,即1小时?那么你从日程安排中解压缩的数据可能是这样的吗? (简化了一些规范化)

<强> CalendarEntries ScheduleID ClassroomID 日期 StartTime(假设固定持续时间 - 如果不是,则添加结束时间

如果时间表合适,上面会填充,并且会保留所有教室,日期和时间吗?

如果您要创建新计划,则可以将所有建议的新条目生成到具有相同结构的临时表中:

...
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

你想要考虑主题和资源,即工作人员。 添加一些说明,我会在我重新开始时看看我是否可以指出正确的方向;)

注意 - 这很麻烦。我分开了开始和结束时间,你可以简化上述内容。如果你有一个&#34;插槽,那么它也会简单得多。系统而不是基于时间的课程。还有更好的方法来构建它 - 让我知道这是否是你反对的问题,我会改进它。