【发布时间】:2018-12-31 15:39:49
【问题描述】:
我正在尝试以 1 小时为增量来获取我酒店的房间可用性。因此,例如,如果房间是从上午 9 点到上午 10 点以及从上午 12 点到下午 3 点预订的,我试图获取 available_from 到 available_to 之间所有其他时间的 1 小时增量
我可以在桌子上留下加入并获得房间可用性,但不能获得时间段。
这是我的相关架构:
酒店:
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
【问题讨论】:
-
我看不清楚,如果您提供一些示例数据和预期结果,我将不胜感激。
-
@ErayBalkanli 添加了
-
所以在你的例子中,房间:1 在 2019 年 1 月 1 日全天可用,对吗? @HeelMega
-
这是正确的@ErayBalkanli
-
Rooms 表中有available_from 和available_to,Reservations 表中有Start 和End 字段,它们有什么区别,为什么需要Reservations 表?在您的示例查询中,您也没有使用 Reservations 表中的任何字段吗? @HeelMega