Шахкалпеш ответил на вопрос:
Я думаю, тебе нужно ИЛИ.
SELECT * FROM appts
WHERE (timeStart >='$timeStart'
OR timeEnd <='$timeEnd')
AND dayappt='$boatdate'
Я разместил комментарий, который считаю неправильным, приведя пару контрпримеров:
Это совершенно неправильно - @ShaneD верен. Например, при этом будет выбрано бронирование между 05:00 и 06:00, поскольку фактическое время окончания меньше, чем любое другое время, о котором вы спрашиваете. Он также будет получать аренду с 18:00 по аналогичной причине.
В ответ на мой комментарий Шахкальпеш попросил:
Не могли бы вы опубликовать отдельный ответ с данными и входными параметрами с ожидаемым выводом?
Достаточно справедливо - да. Слегка отредактировано, вопрос говорит:
Логика в том, что прокат лодок можно забронировать
- с 7:00 до 13:00 или
- с 9:00 до 13:00 или
- с 9:00 до 17:00.
Если в этом диапазоне назначена встреча, она должна возвращать встречи, но она оказалась непоследовательной. Если я выберу 9 утра до 1 вечера, ...
Достаточно фона. Мы можем игнорировать дату назначений и просто учитывать время. Я предполагаю, что есть простой способ ограничить время записи в формате чч: мм; на самом деле не все СУБД предоставляют это, но расширение для обработки hh: mm: ss тривиально.
Appointments
Row timeStart timeEnd Note
1 07:00 13:00 First valid range
2 09:00 13:00 Second valid range
3 09:00 17:00 Third valid range
4 14:00 17:00 First plausibly valid range
5 05:00 06:00 First probably invalid range
6 18:00 22:30 Second probably invalid range
При поиске встреч, перекрывающих диапазон 09:00 - 13:00, запрос Шахкальпеша (упрощенный) становится:
SELECT * FROM Appointments
WHERE (timeStart >= '09:00' OR timeEnd <= '13:00')
Это вернет все шесть строк данных. Однако только строки 1, 2, 3 перекрывают период времени с 09:00 до 13:00. Если строки 1, 2 и 3 являются единственными действительными репрезентативными значениями встреч, тогда запрос Шахкальпеша дает правильный ответ. Однако, если строка 4 (которую я считаю правдоподобно действительной) разрешена, ее не следует возвращать. Аналогично, строки 5 и 6 - если они есть - не должны возвращаться. [ На самом деле, предполагая timeStart <= timeEnd
для всех строк в таблице (и нет никаких значений NULL, чтобы что-то испортить), мы можем видеть, что запрос Шахкалпеша возвратит ЛЮБУЮ строку данных для 09 : 00-13: 00, потому что либо время начала строки больше 09:00, либо время окончания меньше 13:00, либо оба значения. Это равносильно написанию 1 = 1
или любой другой тавтологии в предложении WHERE. ]
Если мы рассмотрим запрос ShaneD (как упрощенный):
SELECT * FROM Appointments
WHERE timeStart <= '13:00' AND timeEnd >= '09:00'
мы видим, что он также выбирает строки 1, 2 и 3, но отклоняет строки 4 (потому что timeStart> '13: 00 '), 5 (потому что timeEnd <'09: 00') и 6 (потому что timeStart> '13: 00' ). Это выражение является архетипическим примером того, как выбирать перекрывающиеся строки, считая «встречаются» и «встречаются» (см., Например, « Алгебра интервалов Аллена »). Изменение «> =» и «<=» изменяет набор интервалов, считающихся перекрывающимися. </p>