Использование больше или равно / меньше или равно дважды в одном запросе SQL - PullRequest
0 голосов
/ 01 декабря 2011

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

Проблема, с которой я сталкиваюсь, заключается в том, что при отправке этого запроса:

SELECT * FROM event WHERE begintime <= '$start' AND endtime >= '$end' AND room = '$room';

Я не получаюзаписей.Переменные содержат правильную информацию, поэтому я подозреваю, что то, как я использую арифметические операторы, неверно.Я много осмотрел и нашел много примеров обоих типов сравнений, используемых в одном запросе, но только для одного столбца.Я не нашел примеров того, как кто-то сравнивал бы значение с одним столбцом и значение с другим столбцом, как это все в одном запросе.

Кто-нибудь знает, что я делаю неправильно?Буду признателен за любую оказанную помощь.Спасибо!

РЕДАКТИРОВАТЬ: У меня установлена ​​временная метка в Epoch time, поэтому время начала, введенное в поиск, будет больше или равно тому, что уже есть в базе данных, чтобы упасть между временем начала и конца.Обратное относится к времени окончания, так как время, введенное в поиск, будет меньше или равно времени окончания в базе данных, чтобы упасть между временем начала и окончания.Если щелкнуть по знаку, в базе данных будет время, не указанное в резервировании.Входные данные подтверждены.

Ответы [ 4 ]

0 голосов
/ 01 декабря 2011
SELECT * 
  FROM event 
 WHERE CASE 
          WHEN begintime > '$start' THEN begintime 
          ELSE '$start' 
       END
       <
       CASE 
          WHEN endtime > '$end' THEN '$end'
          ELSE endtime 
       END
       AND room = '$room';
0 голосов
/ 01 декабря 2011

Если я понял пост, $start и $end - это вводимые пользователем данные.

В этом случае вы должны написать запрос как:

SELECT * FROM event WHERE begintime >= '$start' AND endtime <= '$end' AND room = '$room';

Условия приведены в обратном порядке.

0 голосов
/ 01 декабря 2011

Чтобы узнать, что у вас есть разные сценарии:

  • Бронирование начинается в период поиска
  • Бронирование заканчивается в период поиска
  • Бронированиеначинается до периода поиска и заканчивается после него.

Вам необходимо выполнить поиск по всем трем

SELECT * FROM event WHERE ((begintime <= '$start' AND endtime >= '$end') OR (begintime >= '$start' AND endtime <= '$start')  OR (begintime >= '$end' AND endtime <= '$end')) AND room = '$room';
0 голосов
/ 01 декабря 2011

Вы должны поменять их, я полагаю?

Вот оно:

SELECT * FROM event WHERE begintime >= '$start' AND endtime <= '$end' AND room = '$room'; 

Вам нужно время начала после даты начала и до даты окончания.Плюс - вы можете захотеть проверить, соответствуют ли ваши переменные начала и конца следующему:

  1. Они равны (в худшем случае) ИЛИ
  2. begintimeменьше конечного времени.

В противном случае вы не гарантированно получите какие-либо результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...