2016-02-24 2 views
1

У меня есть tbl_availability, который определяет, когда ресурс доступен. Структура таблицы:SQL определить расписание доступности

id - running id 
startdate - when this availability starts 
enddate - when this availability ends 
dayofweek - weekday of availability 
fromtime - start time 
totime - end time 

Там может быть несколько записей для одной и той же DAYOFWEEK, например, одна запись воскресенья 1000-1200 и другая запись по воскресеньям 1300-1400.

Я пытаюсь выяснить, как получить две вещи:

  1. Проверка при вводе новой записи, что не существует никакого конфликта (перекрытие) с существующей записи
  2. Учитывая StartDate и EndDate, найдите все доступные периоды.
+0

Когда вы говорите: «Может быть несколько записей за тот же день недели» вы имеете в виду для того же 'id'? –

ответ

0

Чтобы определить, есть ли конфликт этот запрос будет возвращать диапазоны любого времени перекрытия:

SELECT * FROM tbl_availability 
WHERE (startDate > @CheckEnd AND startDate <= @CheckStart) 
OR (endDate < @CheckStart AND endDate >= @CheckEnd) 
OR (startDate >= @CheckStart AND endDate <= @CheckEnd) 

Первой часть, где положение чек за все, что перекрывает время запуска. Вторая часть проверяет все, что перекрывает время окончания. Третья часть проверяет что-либо в пределах диапазона.

Для проверки доступного диапазона времени в течение определенного времени использования этого:

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) 

Я не проверял эти запросы, так что, возможно, должны быть некоторые настройки здесь происходит.

+0

Не уверен, что вы правильно поняли. Начальная и конечная даты - это когда эти записи действительны, а конфликты перекрытия должны быть проверены как с помощью startdate/enddate, так и с момента времени/времени. Пример Fot, если есть две записи: одна с начальной датой 1 января и датой окончания 10 января, а вторая с начальным стартом 20 января и окончанием 31 января, и оба имеют время от 10:00 и до 12:00, что не является проблемой, так как они для разных периодов. То же самое касается вопроса доступности. – user1480192

Смежные вопросы