У меня была ситуация в моем проекте, которая заключается в следующем.
проверяя наличие свободных номеров
$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 с фиксированной длиной, сравнение строк может быть не таким, как ожидалось.