За последние 24 часа нас посетили 20545 программистов и 1124 робота. Сейчас ищут 695 программистов ...

Как дефрагментировать даты в базе данных?

Тема в разделе "PHP для новичков", создана пользователем drkrol, 8 дек 2016.

  1. drkrol

    drkrol Активный пользователь

    С нами с:
    25 авг 2016
    Сообщения:
    38
    Симпатии:
    1
    Здравствуйте. Имеется вот такая база данных: sqlfiddle.com/#!9/9554b . Первая таблица отвечает за отображение номеров в гостинице, которые существуют, вторая - за существующие брони в гостинице. Я попытался её визуализировать:
    [​IMG]
    За такой порядок расстановки/распределения номеров отвечает sql код. Он берёт новые даты заезда и выезда, сравнивает их с таблицей main и проверяет свободный номер на эти даты. Первый попавшийся свободный номер он присвоит новой броне. Всё логично. От сюда и следует такой "хаотичное" распределение номеров. Вот, собственно, сам select запрос на выдачу номера.
    PHP:
    1. SET @start = '2016-12-12'; -- Новая дата заезда
    2. SET @end = '2016-12-20'; -- Новая дата выезда
    3. SELECT a.nomer
    4. FROM allnomer a
    5. LEFT JOIN main m
    6. ON a.nomer = m.numbernomer
    7. AND DATEDIFF(m.datestart, @end) * DATEDIFF(m.dateend, @start) <= 0
    8. WHERE a.type = 'lux' AND m.numbernomer IS NULL
    9. LIMIT 1
    Но есть у меня одна проблема. По сути, 12, 13, 14... 20 числа в гостинице жить никто не будет. Это свободные дни. Они образовались из-за распределения дат моим скриптом. Но если 11 числа придёт бронь на даты с 12 по 20, то скрипт её отвергнет (вернёт null), ибо даты заезда/выезда пересекаются. И это вполне ожидаемо, но хотелось бы решить эту проблему. Если перераспределить брони, то всё встанет на свои места, и номер с 12 по 20 число откроется.
    [​IMG]
    Я не трогал еще действующие брони, я перемещал только будущие.
    Хотелось бы узнать, на сколько реальна эта затея с перераспределением/дефрагментацией, и как её воплотить в жизнь (может быть уже было что-то подобное, либо есть такой sql запрос для моего случая) ?
     
  2. Slavka

    Slavka Активный пользователь

    С нами с:
    1 окт 2013
    Сообщения:
    722
    Симпатии:
    41
    Почему то мне кажется что в этом и есть загвоздка

    надо не только проверять свободны ли в эти дни - но и находить ближайший занятый день
    например пришел запрос с 13 по 16 число.. первое что ищем совпадение - занятое 12 и свободные с 13 по 16

    при таком раскладе - никакая дефрагментация будет не нужна ;)
     
  3. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    это потому, что в гостиницах продают не дни, а ночи. В данном коде почти ничего менять не требуется. Надо менять логику в голове. Если человек хочет заехать 12, это значит, что он хочет провести ночь с 12 на 13. По факту, тебе надо решить, какое число у тебя означает эту ночь - 12 или 13. Если 13, то вопрос решён.

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

    Slavka Активный пользователь

    С нами с:
    1 окт 2013
    Сообщения:
    722
    Симпатии:
    41
    от части ты прав от части нет
    я вспомнил свою последнюю поездку
    ночами считается количество
    но последний день ( день отправки ) считается до обеда всегда
    а день приезда после обеда ..

    и даже моя идея с проверкой - немного не правильна - надо пересекать эти дни

    т.е. проверяем чтобы 12 число было занято а числа с 13 по 16 свободны
     
  5. drkrol

    drkrol Активный пользователь

    С нами с:
    25 авг 2016
    Сообщения:
    38
    Симпатии:
    1
    @igordata, на сервере дата выезда и дата заезда - разные дня, но на клиенте иначе. Когда выбираешь даты, допустим, выбрал заезд 10, выезд 12, то тебе отобразится: "Заезд 10 с 12:00, выезд 13 до 11:00" (в номере еще убраться надо). Так, как ты сказал, так у меня и устроено.
    Мне предлагали сделать так))) Не вариант. Смотри:
    Я пронумеровал очерёдность бронирования номера. 4ая бронь не знает о существовании 5ой, так как 5ой еще нет.
    [​IMG]
    Здесь поможет только перераспределение
     
  6. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    >> Здесь поможет только перераспределение

    Если клиент уже забронировал 301 номер, разве потом, позже, можно заменить на другой номер?
     
  7. drkrol

    drkrol Активный пользователь

    С нами с:
    25 авг 2016
    Сообщения:
    38
    Симпатии:
    1
    @Chushkin, можно. Он забронировал тип номера: люкс, эконом, вип, стандарт. И вот в моём случае, в моей воображаемой гостинице, есть 4 номера люкс: 301, 302, 303 и 304. Человек не знает, в какой именно он номер заедет. Он знает только то, что номер у него люкс.
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    хозяин - барин