Здравствуйте. Имеется вот такая база данных: sqlfiddle.com/#!9/9554b . Первая таблица отвечает за отображение номеров в гостинице, которые существуют, вторая - за существующие брони в гостинице. Я попытался её визуализировать: За такой порядок расстановки/распределения номеров отвечает sql код. Он берёт новые даты заезда и выезда, сравнивает их с таблицей main и проверяет свободный номер на эти даты. Первый попавшийся свободный номер он присвоит новой броне. Всё логично. От сюда и следует такой "хаотичное" распределение номеров. Вот, собственно, сам select запрос на выдачу номера. PHP: SET @start = '2016-12-12'; -- Новая дата заезда SET @end = '2016-12-20'; -- Новая дата выезда SELECT a.nomer FROM allnomer a LEFT JOIN main m ON a.nomer = m.numbernomer AND DATEDIFF(m.datestart, @end) * DATEDIFF(m.dateend, @start) <= 0 WHERE a.type = 'lux' AND m.numbernomer IS NULL LIMIT 1 Но есть у меня одна проблема. По сути, 12, 13, 14... 20 числа в гостинице жить никто не будет. Это свободные дни. Они образовались из-за распределения дат моим скриптом. Но если 11 числа придёт бронь на даты с 12 по 20, то скрипт её отвергнет (вернёт null), ибо даты заезда/выезда пересекаются. И это вполне ожидаемо, но хотелось бы решить эту проблему. Если перераспределить брони, то всё встанет на свои места, и номер с 12 по 20 число откроется. Я не трогал еще действующие брони, я перемещал только будущие. Хотелось бы узнать, на сколько реальна эта затея с перераспределением/дефрагментацией, и как её воплотить в жизнь (может быть уже было что-то подобное, либо есть такой sql запрос для моего случая) ?
Почему то мне кажется что в этом и есть загвоздка надо не только проверять свободны ли в эти дни - но и находить ближайший занятый день например пришел запрос с 13 по 16 число.. первое что ищем совпадение - занятое 12 и свободные с 13 по 16 при таком раскладе - никакая дефрагментация будет не нужна
это потому, что в гостиницах продают не дни, а ночи. В данном коде почти ничего менять не требуется. Надо менять логику в голове. Если человек хочет заехать 12, это значит, что он хочет провести ночь с 12 на 13. По факту, тебе надо решить, какое число у тебя означает эту ночь - 12 или 13. Если 13, то вопрос решён. С другой стороны, никто не мешает тебе докинуть до даты ещё и время, что позволит тебе хоть по часам расписание составлять.
от части ты прав от части нет я вспомнил свою последнюю поездку ночами считается количество но последний день ( день отправки ) считается до обеда всегда а день приезда после обеда .. и даже моя идея с проверкой - немного не правильна - надо пересекать эти дни т.е. проверяем чтобы 12 число было занято а числа с 13 по 16 свободны
@igordata, на сервере дата выезда и дата заезда - разные дня, но на клиенте иначе. Когда выбираешь даты, допустим, выбрал заезд 10, выезд 12, то тебе отобразится: "Заезд 10 с 12:00, выезд 13 до 11:00" (в номере еще убраться надо). Так, как ты сказал, так у меня и устроено. Мне предлагали сделать так))) Не вариант. Смотри: Я пронумеровал очерёдность бронирования номера. 4ая бронь не знает о существовании 5ой, так как 5ой еще нет. Здесь поможет только перераспределение
>> Здесь поможет только перераспределение Если клиент уже забронировал 301 номер, разве потом, позже, можно заменить на другой номер?
@Chushkin, можно. Он забронировал тип номера: люкс, эконом, вип, стандарт. И вот в моём случае, в моей воображаемой гостинице, есть 4 номера люкс: 301, 302, 303 и 304. Человек не знает, в какой именно он номер заедет. Он знает только то, что номер у него люкс.