[Даты, время] Поиск свободных дат в свободных диапазонах - Алгоритмы

rtyug
На сайте с 13.05.2009
Offline
263
1941

Здравствуйте, требуется помощь

Даны диапазоны разных дат, в диапазон могут входить даты с разных месяцев. (Это диапазон свободных дат, которые свободные в данный момент)

задача: найти диапазон свободных дат по указанному промежутку дат 2017-04-10 - 2017-04-13 или другой промежуток

Я ума не приложу как это сделать. Может подсказать?

Это НЕ задача в универе, это реальная задача :)

пример:

+-------+---------+------------+------------+
| city | id | to | from |
+-------+---------+------------+------------+
| 15 | 1 | 2017-04-16 | 2017-04-16 |
| 15 | 2 | 2017-04-16 | 2017-04-16 |
| 15 | 3 | 2017-04-14 | 2017-04-14 |
| 15 | 3 | 2017-04-14 | 2017-04-14 |
| 15 | 3 | 2017-04-14 | 2017-04-14 |
| 15 | 4 | 2017-04-14 | 2017-04-14 |
| 15 | 5 | 2017-04-14 | 2017-04-14 |
| 15 | 6 | 2017-04-14 | 2017-04-14 |
| 15 | 7 | 2017-04-14 | 2017-04-14 |
| 15 | 8 | 2017-04-14 | 2017-04-14 |
| 15 | 9 | 2017-04-15 | 2017-04-15 |
| 15 | 9 | 2017-04-22 | 2017-04-16 |
| 15 | 10 | 2017-04-15 | 2017-04-15 |
| 15 | 10 | 2017-04-22 | 2017-04-16 |
| 15 | 11 | 2017-04-15 | 2017-04-15 |
| 15 | 11 | 2017-04-22 | 2017-04-16 |
| 15 | 22 | 2017-04-15 | 2017-04-15 |
| 15 | 22 | 2017-04-22 | 2017-04-16 |
| 15 | 23 | 2017-05-31 | 2017-04-15 |
| 15 | 24 | 2017-04-30 | 2017-04-15 |
+-------+---------+------------+------------+
Спалил тему: Pokerstars вывод WMZ, etc на VISA 0% или SWIFT + Конверт USD/GBP,etc (net profit $0,5 млрд) (https://minfin.com.ua/blogs/94589307/115366/) Monobank - 50₴ на счет при рег. тут (https://clck.ru/DLX4r) | Номер SIP АТС Москва 7(495) - 0Ꝑ, 8(800) - 800Ꝑ/0Ꝑ (http://goo.gl/XOrCSn)
tommy-gung
На сайте с 22.11.2006
Offline
304
#1

сравнивать.

дата - это число. можно перевести в секунды, если так проще понять

Здесь не могла быть ваша реклама
_
На сайте с 24.03.2008
Offline
381
#2

Если вначале отсортировать по первой дате, то упростится в разы.

rtyug
На сайте с 13.05.2009
Offline
263
#3

Спасибо. Я раздуплился, я сделал проще:

WHERE (DATE(from) <= '2017-04-20' AND DATE(to) >= '2017-04-22')

таким образом оно выберет даты в свободном диапазоне который есть.

Я думаю что будет верно.

ДП
На сайте с 23.11.2009
Offline
203
#4

Как-то у вас не очень понятно задачка сформулирована в плане

найти диапазон свободных дат по указанному промежутку дат

Судя по вашему решению вам надо найти диапазон в таблице, в который попадает диапазон-параметр.

Тогда да, ваше решение верное, операции сравнения дат в БД поддерживаются.

rtyug
На сайте с 13.05.2009
Offline
263
#5

сейчас задача когда в один диапазон может входить несколько диапазонов

есть какой-то пример реализации в этом контексте?

вариант 1

т.е. надо искать диапазон:

2017-08-01 по 2017-08-05

среди диапазонов:

2017-08-01 по 2017-08-02

2017-08-01 по 2017-08-03

2017-08-05 по 2017-08-05

2017-08-01 по 2017-08-30
2017-08-01 по 2017-08-20

вариант 2

т.е. надо искать диапазон:

2017-08-01 по 2017-08-05

среди диапазонов:

2017-08-01 по 2017-08-02

2017-08-01 по 2017-08-03

2017-08-05 по 2017-08-05

2017-08-01 по 2017-08-30

2017-08-01 по 2017-08-20

2017-08-20 по 2017-08-20

Синим цветом я выделил то что не правильно

Пробовать как-то в тупую перебрать, да? можно мозг поломать :)

ДП
На сайте с 23.11.2009
Offline
203
#6

Вы можете сформулировать задачки, используя термины из предметной области? Ну типа там расписание занятости номеров и даты туров или что там у вас? Потому что лично мне, по вашим текущим формулировкам -

сейчас задача когда в один диапазон может входить несколько диапазонов
- не понятна.

Оосбенно с учётом примеров.

nezabor
На сайте с 19.07.2010
Offline
152
#7

rtyug, мне кажется место не может быть свободно дважды, так как место одно.

Но у места может быть разрыв в 0 секунд, но уже в разных диапазона.

Например:

отель и сезоны (обычные диапазоны)

1 май - 100р

2 июнь - 200р

3 июль - 400р

4 август - 300р

Возьмем отдых: с 9 мая по 2 августа.

то в нашем примере у нас будет 4 диапазона.

по решению:

1 получаем количество дней которые мы должны отдохнуть DP(Дней Планово).

2 получаем все диапазоны с одного PR(места отдыха)которые нам подошли, (притом, что диапазоны у нас с первого числа указаны и по конец месяца, тогда вычиаем с первого и последнего ненужные нам дни)

2.1 складываем дни из диапазонов DF(дней свободно)

3 сравниваем дни

if(DP == DS) {
$Place_rest_array[] = PR;
}

ну и все полученные места пробегаемся

Чудес не бывает...

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий