Как проверить наличие повторного расписания перед добавлением нового расписания

Я пытаюсь построить систему расписания для занятий

Расписание имеет повторяющийся тип, как Ежедневно, Еженедельно, Ежемесячно.

Теперь я не могу проверить, что новое расписание уже добавлено / находится между другим расписанием и т. Д.,

Поля моей формы

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

Решение

Можете ли вы уточнить это, пожалуйста? Когда вы создаете новое расписание, вы создаете все повторяющиеся записи и пытаетесь проверить, не будет ли конфликтов перед добавлением еще одного повторного расписания?

Я предполагаю, что Старт приравнивается к дате, а ваши классы имеют фиксированные временные интервалы, т.е. 1 час? То есть ваши распакованные данные из расписания могут выглядеть так? (Упрощено с некоторой нормализацией)

CalendarEntries
ScheduleID
ClassroomID
Дата
Начальное время (Предполагается фиксированная продолжительность — если нет, добавьте время окончания)

Вышеуказанное заполняется, как только расписание будет в порядке, и будет ли содержать все классные комнаты, даты и время?

Если вы собираетесь создать новое расписание, вы можете сгенерировать все предложенные новые записи во временную таблицу с такой же структурой:

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

Возможно, вы захотите рассмотреть предметы и ресурсы, то есть персонал слишком предположительно.
Добавьте некоторые пояснения, и я посмотрю, смогу ли я указать вам правильное направление, когда вернусь;)

Обратите внимание — это грязно. Я бы разделил время начала и окончания, и вы можете упростить вышесказанное. Это также намного проще, если у вас есть система «слот», а не на основе времени, если это уроки. Существуют также лучшие способы структурирования — дайте мне знать, если вы столкнулись с такой проблемой, и я уточню ее.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]