[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Алгоритм вывода свободных таймслотов с шагом 30мин
Sergio022
Всем привет, подскажите, пожалуйста, сломал всю голову себе, как решить задачу.

Есть календарь для бронирования, в базе MySQL хранится информация о занятом времени (timestamp поля start и end).

Задача- вывести доступное к бронированию время (таймслоты заданного размера с шагом по 30 минут).

Например: берём день с 7:00 до 19:00, в этом дне занято с 7:30 до 9:00 и с 14:00 до 17:00 и нужно вывести доступное для бронирования время(например 1.5 часа с шагом в 30 минут).

Должно вывестись:
9:00-10:30;
9:30-11:00;
10:00-11:30;
10:30-12:00;
11:00-12:30;
11:30-13:00;
12:00-13:30;
12:30-14:00;
17:00-18:30;
17:30-19:00
kaww
Сделать опорную таблицу со всеми start. Тогда запрос будет типа такого:
SELECT
CAST(CONCAT(DATE(NOW()), ' ', `t`.`time`) AS DATETIME) AS `start`,
CAST(CONCAT(DATE(NOW()), ' ', `t`.`time`) AS DATETIME) + INTERVAL 90 MINUTE AS `end`
FROM `times` AS `t`
LEFT JOIN `booking` AS `b` ON CAST(CONCAT(DATE(NOW()), ' ', `t`.`time`) AS DATETIME) < `b`.`end` AND CAST(CONCAT(DATE(NOW()), ' ', `t`.`time`) AS DATETIME) + INTERVAL 90 MINUTE > `b`.`start`
WHERE `b`.`start` IS NULL
AND
(`t`.`time` LIKE '%:00:00' OR `t`.`time` LIKE '%:30:00')
AND `t`.`time` BETWEEN '09:00:00' AND '17:30:00'

http://sqlfiddle.com/#!9/73da0a/4
times.time может быть datetime или timestamp вместо char. Тогда запрос будет немного проще, т.к. с полем можно будет обращаться как с датой и использовать функцию time(), либо генерировать times каждый день новые.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.