我正在使用数据库,并且在计算酒店的可用预订房间时间时遇到问题
我的桌子看起来
房间:
_________________________________________________________________
| roomid | roomname | type | time_start | time_end |
|_________|___________|___________|_____________|_________________|
| R01 | Room1 | 1 | 07:00 | 07:30 |
|_________|___________|___________|_____________|_________________|
| R01 | Room1 | 2 | 08:30 | 9:30 |
|_________|___________|___________|_____________|_________________|
| R02 | Room2 | 3 | 7:30 | 8:15 |
|_________|___________|___________|_____________|_________________|
| R02 | Room2 | 4 | 10:15 | 11:20 |
|_________|___________|___________|_____________|_________________|
我有一个开始时间和持续时间的预订室。我想返回可用的time_start和time_end用户可以预订房间。 示例:我要在数据库中查询,并且选择时间几乎等于用户输入的时间,而持续时间的空闲时间必须> = 30。用户希望预订从8:00开始,预订时间为30分钟。在我的数据库中,您可以看到我有两个预订房间。 1号房间的预订时间为7:00-> 7h:30和8:30-> 9:30,这意味着1号房间在7h31-> 8:29可用。预订房间02:7:30-> 8:15和10:15-> 11:20,这意味着房间1在8:16-> 10:14可用。
我有两个房间的用户可以预订:
1 . Room01: 7h31 -> 8:29
2. Room02: 8:16 -> 10:14
因为条件是预订时间最接近用户输入时间,并且预订时间必须大于或等于30。这意味着: 我选择room1用户可以预订,我希望返回时间可用的用户可以预订(7h31-> 8:29)。 如果用户在5:00:00预订房间,但在我的预订表中,时间从7:00:00开始并在11:00:00结束,我想获取用户的预订时间,结束时间为5:00:00。我希望返回的查询为start_time:5:00:00和end_time:5:30:00。我该怎么办?
我尝试写出如下的sql代码
SELECT r.start_time, r.end_time
FROM rooms r
INNER JOIN
(
SELECT room_id, r.time_start - r.end_time > :input_time)
FROM r
GROUP BY room_id
) r1
ON b1.room_id = b.room_id
但是我认为它不起作用。
我有一个问题。如何返回time_start和time_end可用的用户可以使用条件预订时间最接近用户输入时间的预订房间,并且如果我有start_time和list预订房间,则预订时间必须大于或等于30。 如果用户在5:00:00预订房间,但在我的预订表中,时间从7:00:00开始并在11:00:00结束,我想获取用户的预订时间,结束时间为5:00:00。我希望返回的查询是time_start:5:00:00和time_end:5:30:00。我该怎么办?
答案 0 :(得分:0)
使用lag()window function可为您带来预期的结果:
SELECT
room_id,
last_time + interval '1 minute' AS free_time_start,
time_start - interval '1 minute' AS free_time_end
FROM (
SELECT
lag(time_end) OVER (PARTITION BY room_id ORDER BY time_start) AS last_time,
*
FROM
rooms
) s
WHERE last_time < time_start
使用window函数,您可以从先前的记录中获取一个值(您可以使用PARTITION BY
子句在room_id上对它进行分组,并且必须添加一定的顺序)。
如果上一个结束时间小于当前开始时间,则存在空闲时间。
添加预订时间:
您可以获取预订时间,并检查预订时间是否适合所计算的空闲时间。之后,您可以按插槽进行订购,并使用LIMIT
SELECT
free_time_start,
free_time_end,
booking_start BETWEEN free_time_start AND free_time_end
AND
booking_end BETWEEN free_time_start AND free_time_end
FROM (
SELECT
room_id,
last_time + interval '1 minute' AS free_time_start,
time_start - interval '1 minute' AS free_time_end,
'08:00'::time AS booking_start,
'08:00'::time + interval '29 minutes' AS booking_end
FROM (
SELECT
lag(time_end) OVER (PARTITION BY room_id ORDER BY time_start) AS last_time,
*
FROM
rooms
) s
WHERE last_time < time_start
) s
ORDER BY 3 DESC, 1
LIMIT 1
答案 1 :(得分:0)
如果用户在预订房间时提前输入时间?