我有一个数据库,人们可以在两个特定的时间内预订房间,但可能会有其他人在同一时间内搜索可用的房间,或者部分在同一时刻。
数据库如下:
order | room | user | date (date-format) | from (time) | to (time)
1 123 foo 2013-04-04 12:00:00 17:00:00
当另一个用户在f.ex 13:00到18:00搜索房间是否可用时,问题就来了,因为我只能搜索房间是否在同一时间可用。
查询必须在特定日期和时间搜索特定房间。如果房间在所有或某些时间都很忙,我想捕捉到这一点,并告诉用户房间很忙。
有什么建议吗?如果通过PHP更容易管理,我也会很高兴:-(
为什么不像这样使用SQL来解决它(未经测试(:
SELECT *
FROM booked
WHERE
room=$room AND
date=$date AND
(
(
/*
The reservation starts in the requested period
*/
from <= $start_time AND
to > $start_time
) OR (
/*
The reservation ends in the requested period
*/
from < $end_time AND
to >= $end_time
)
);
此查询将返回$start_time
和$end_time
之间的所有预订,并允许背靠背的预订。如果您不想允许背靠背预订,请将<
和>
更改为<=
和=>
。
重要:请确保不要只使用字符串插值并插入未经配置的用户提供的输入,因为这会使您的应用程序容易受到SQL注入攻击。
@Delphinator 对答案的改进
SELECT *
FROM booked
WHERE
room=$room AND
date=$date AND
(
TIME("$start_time") BETWEEN from and to
OR
TIME("$end_time") BETWEEN from and to
);
BETWEEN
完全符合你的想法。