Я пытаюсь получить доступность номеров в моем отеле с шагом в 1 час.Так, например, если комната забронирована с 9:00 до 10:00 и с 12:00 до 15:00, я пытаюсь получить приращения в 1 час для всех других периодов времени между available_from и available_to
.оставьте присоединиться к столу и получите доступность комнаты, но только не временные интервалы.
Вот моя связанная схема:
Отель:
Id | name
Бронирование:
Id | hotel_id | room_id | start | end | status
Номера:
Id | hotel_id | name | number | available_from | available_to
Вот мой запрос:
SELECT r.id, r.name, r.number, r.type, r.rating
FROM rooms r
LEFT OUTER JOIN reservations res ON res.room_id = r.id
AND CURRENT_TIMESTAMP BETWEEN r.available_from AND r.available_to
GROUP BY r.id, r.type
Пример:
(Это массив, который я пытаюсь получить из базы данных. Игнорировать имена свойств):
[{"roomNumber": 1, "availableTimes": ["2019-01-01 00:00:00", "2019-01-01 01:00:00", "2019-01-01 02:00:00","2019-01-01 03:00:00", "2019-01-01 04:00:00", "2019-01-01 05:00:00", "2019-01-01 06:00:00"," 2019-01-01 07:00:00 "," 2019-01-01 08:00:00 "," 2019-01-01 09:00:00 "," 2019-01-01 10:00: 00 "," 2019-01-01 11:00:00 "," 2019-01-01 12:00:00 "," 2019-01-01 13:00:00 "," 2019-01-01 14:00:00 "," 2019-01-01 15:00:00 "," 2019-01-01 16:00:00 "," 2019-01-01 17:00:00 "," 2019-01-01 18:00:00 "," 2019-01-01 19:00:00 "," 2019-01-01 20:00:00 "," 2019-01-01 21:00:00 ","2019-01-01 22:00:00", "2019-01-01 23:00:00"]}]
Я попробовал следующее:
SELECT free_from, free_until
FROM (
SELECT a.end AS free_from,
(SELECT MIN(c.start)
FROM reservations c
WHERE c.start > a.end) as free_until
FROM reservations a
WHERE NOT EXISTS (
SELECT 1
FROM reservations b
WHERE b.start BETWEEN a.end AND a.end + INTERVAL 1 HOUR
)
AND a.end BETWEEN '2019-01-03 09:00' AND '2019-01-03 21:00'
) as d
ORDER BY free_until-free_from
LIMIT 0,3;
Но я получаю одну строку, возвращенную только с 1 результатом, что также неверно.Как мне решить эту проблему?
Пример данных:
Отель:
1 | Marriott
Бронирование:
1 | 1 | 1 | 2019-01-03 15:00:00 | 2019-01-03 17:00:00 | Confirmed
1 | 1 | 1 | 2019-01-03 18:00:00 | 2019-01-03 20:00:00 | Confirmed
Номера:
1 | 1 | "Single" | 528 | 09:00:00 | 21:00:00
Ожидаемый результат
Идентификатор комнаты |Название комнаты |Доступные времена
1 | "Single" | 2019-01-03 09:00:00, 2019-01-03 10:00:00, 2019-01-03 11:00:00, 2019-01-03 12:00:00, 2019-01-03 13:00:00, 2019-01-03 14:00:00, 2019-01-03 17:00:00, 2019-01-03 20:00:00, 2019-01-03 21:00:00, 2019-01-03 22:00:00, 2019-01-03 23:00:00, 2019-01-03 24:00:00