К сожалению, такие бизнес-правила не могут быть определены или управляться на уровне таблицы с помощью индексации, правил или отношений. Вы могли бы начать принимать процедуры магазина, но в конце дня? Скажите, может ли база данных сделать это? Что ж, в вашем пользовательском интерфейсе действительно не было бы возможности возвращать информацию пользователю.
В результате довольно просто внести это прямо в форму (ы) ввода данных. Таким образом, пользователь получает удобные подсказки и сообщения.
Чтобы предотвратить коллизии, логика здесь довольно проста:
Коллизия происходит, когда:
RequestStartDate <= EndDate и RequestEndDate> = StartDate
Таким образом, приведенный выше довольно простой запрос, но если произойдет какое-либо столкновение, приведенное выше вернет записи ... и вы просто не разрешите бронирование. Другими словами, так как мы НИКОГДА не разрешаем бронирование при столкновении, то вышеприведенное простое утверждение будет работать для нас.
dim strWhere as string
dim dtRequeestStartDate as date
dim dtRequestEndDate as date
dtRequestStartDate = inputbox("Enter start Date")
dtRequestEndDate = inputbox("Enter end date")
strWhere="#" & format(dtRequestStartDate,"mm/dd/yyyy") & "# <= EndDate" & _
" and #" & format(dtRequestEndDate,"mm/dd/yyyy") & "# >= StartDate"
if dcount("*","tableBooking",strWhere) > 0 then
msgbox "sorry, you cant book
...bla bla bla....
Выше приведен только пример, и я уверен, что вы создадите красивую форму, которая запрашивает у пользователя даты бронирования, или поймаете ее при вводе данных.
Однако чтохорошо, что простые условия и логика, изложенные выше, возвращают ЛЮБЫЕ коллизии или любое перекрытие в этом диапазоне дат. Это включает один внутренний, или оба конца, начинающиеся снаружи, или один конец между промежутком начала / конца.