За последние 24 часа нас посетили 21408 программистов и 1387 роботов. Сейчас ищут 673 программиста ...

Получить массив со свободными окнами по времени

Тема в разделе "PHP и базы данных", создана пользователем Светлана92, 22 июл 2022.

Метки:
  1. Светлана92

    Светлана92 Новичок

    С нами с:
    22 июл 2022
    Сообщения:
    1
    Симпатии:
    0
    Всем привет, подскажите пожалуйста как можно вытащить все диапазоны времени из БД?
    Поясню: Есть онлайн запись на различные услуги, которые пишутся в таблицу visits.

    Таблица выглядит так:
    id | userId | dateStart | dateEnd
    1 | 31 |2022-07-20 10:00:00|2022-07-20 10:40:00
    2 | 28 |2022-07-20 14:20:00|2022-07-20 15:20:00
    3 | 74 |2022-07-20 18:00:00|2022-07-20 18:30:00
    4 | 27 |2022-07-21 08:00:00|2022-07-20 09:30:00
    4 | 89 |2022-07-21 12:10:00|2022-07-20 13:00:00

    Запись принимается с 08:00 и заканчивается в 19:00.

    На вход метода приходит время которое длится услуга (допустим 90 минут). Как можно получить все диапазоны времени свободных окон в которое укладывается длительность услуги? По дням, т.е. с 08:00 до 19:00, 19:00 включительно (принимается последняя запись).

    В результате нужно что то типа этого:

    PHP:
    1. [
    2.         ['2022-07-20'] => [
    3.             [
    4.                 'dateStart' => '08:00',
    5.                 'dateEnd' => '09:30'
    6.             ],
    7.             [
    8.                 'dateStart' => '08:30',
    9.                 'dateEnd' => '10:00'
    10.             ],
    11.             [
    12.                 'dateStart' => '10:40',
    13.                 'dateEnd' => '12:10'
    14.             ],
    15.             [
    16.                 'dateStart' => '11:00',
    17.                 'dateEnd' => '12:30'
    18.             ],
    19.             [
    20.                 'dateStart' => '11:30',
    21.                 'dateEnd' => '13:00'
    22.             ],
    23.             [
    24.                 'dateStart' => '12:00',
    25.                 'dateEnd' => '13:30'
    26.             ],
    27.             [
    28.                 'dateStart' => '12:30',
    29.                 'dateEnd' => '14:00'
    30.             ],
    31.             [
    32.                 'dateStart' => '13:00',
    33.                 'dateEnd' => '14:30'
    34.             ],
    35.             [
    36.                 'dateStart' => '15:20',
    37.                 'dateEnd' => '15:50'
    38.             ],
    39.             [
    40.                 'dateStart' => '15:30',
    41.                 'dateEnd' => '17:00'
    42.             ],
    43.             [
    44.                 'dateStart' => '16:00',
    45.                 'dateEnd' => '17:30'
    46.             ],
    47.             [
    48.                 'dateStart' => '16:30',
    49.                 'dateEnd' => '18:00'
    50.             ]
    51.         ]
    52.     ]
     
  2. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    1. Извлечь в массив все занятые промежутки времени, в сортированном виде. Может быть проще будет сразу преобразовать в формат Unix.
    2. Пройтись в цикле для извлечения времени окончания одного(или начала рабочего дня) и начала следующего промежутка(или конца рабочего дня).