Intereting Posts

требуется обновление для запроса mysql для выбора диапазона дат для бронирования гостиничного номера или любой вещи

У меня была ситуация в моем проекте, которая заключается в следующем.

проверяя наличие свободных номеров

$sel_from_bookings="SELECT room_no FROM `booking` WHERE (('".$_POST['req_tdate']."' BETWEEN check_indate AND check_outdate) OR ('".$_POST['req_fdate']."' BETWEEN check_indate AND check_outdate)"; $sel_from_reserv="SELECT room_no FROM `reservation` WHERE (('".$_POST['req_tdate']."' BETWEEN check_indate AND check_outdate) OR ('".$_POST['req_fdate']."' BETWEEN check_indate AND check_outdate))"; $sel_rooms="SELECT room_no FROM rooms WHERE room_no NOT IN (".$sel_from_bookings.") AND room_no NOT IN (".$sel_from_reserv.")"; 

Первый запрос возвращает список номеров номеров из таблицы бронирования, который удовлетворяет параметрам daterange

аналогичным образом, второй из них один и тот же из таблицы резервирования

последний запрос использует список, предоставленный двумя вышеуказанными запросами, и получает список комнат, которые не находятся в сгенерированном списке.

отлично работает на 10-08-2010 / 15-08-2010

отлично работает 20-08-2010 / 25-08-2010

когда я даю даты между 10 и 15, он отлично работает аналогично для 20 и 25, а также отлично работает на даты 14-08-2010 и 21-08-2010

но не работает с 16-08-2010 по 19-08-2010

пожалуйста, спросите меня.

Благодарю.

 SELECT * FROM room WHERE room_no NOT IN ( SELECT room_no FROM booking WHERE check_outdate >= @req_fdate AND check_indate <= @red_tdate ) AND room_no NOT IN ( SELECT room_no FROM reservation WHERE check_outdate >= @req_fdate AND check_indate <= @red_tdate ) 

Обратите внимание на порядок или аргументы: @req_fdate вот первая дата здесь ( из ), @req_tdate – последняя дата ( до ).

Чтобы проверить наличие с Aug 16 Aug 19 августа, используйте следующее:

 SELECT * FROM room WHERE room_no NOT IN ( SELECT room_no FROM booking WHERE check_outdate >= '2010-08-16' AND check_indate <= '2010-08-19' ) AND room_no NOT IN ( SELECT room_no FROM reservation WHERE check_outdate >= '2010-08-16' AND check_indate <= '2010-08-19' ) 

какой тип данных имеет поля check_indate и check_outdate?

я предполагаю, что ключевое слово BETWEEN работает не так, как ожидалось. Делают ли все по-другому, если вы замените a BETWEEN b and c с помощью a >= b and a <= c ?

 $sel_from_bookings="SELECT room_no FROM `booking` WHERE (('".$_POST['req_tdate']."' >= check_indate AND '".$_POST['req_tdate']."' <= check_outdate) OR ('".$_POST['req_fdate']."' >= check_indate AND '".$_POST['req_fdate']."' <= check_outdate)"; $sel_from_reserv="SELECT room_no FROM `reservation` WHERE (('".$_POST['req_tdate']."' >= check_indate AND '".$_POST['req_tdate']."' <= check_outdate) OR ('".$_POST['req_fdate']."' >= check_indate AND '".$_POST['req_fdate']."' <= check_outdate))"; $sel_rooms="SELECT room_no FROM rooms WHERE room_no NOT IN (".$sel_from_bookings.") AND room_no NOT IN (".$sel_from_reserv.")"; 

ps: вы также можете попытаться отладить, переведя свои примеры в тип данных столбцов даты. если мы предположим, что ваш столбец check_indate имеет тип datetime, посмотрите, что возвращает mysql, если вы попробуете это:

 SELECT CAST('16-08-2010' as datetime); 

против

 SELECT CAST('20-08-2010' as datetime); 

Мой mysql здесь не работает на обоих примерах, так как он ожидает формат yyyy-mm-dd в формате даты, но он может дать вам подсказку 🙂

Я бы посмотрел тип поля данных, которое вы используете для check_outdate и check_indate.

Если вы используете «DATE», убедитесь, что входной файл находится в формате YYYY-MM-DD. Если вы введете что-нибудь еще без разделителей, то MySQL угадает дату. Вы можете использовать функцию PHP для преобразования формата даты с DD-MM-YYYY (или любого другого) в правильную дату, ожидаемую MySQL:

 $date ='12-12-2007'; $dateTime = new DateTime($date); $formatted_date=date_format ( $dateTime, 'Ymd' ); echo $formatted_date; // This will output 2007-12-12 

Если вы используете VARCHAR или CHAR с фиксированной длиной, сравнение строк может быть не таким, как ожидалось.