我有一个数据库,人们可以在两个特定时间内预订房间,但可能有其他人在同一时间内或部分同时搜索可用房间。
数据库看起来像这样:
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管理更容易,我也很高兴: - )
答案 0 :(得分:2)
为什么不使用像这样的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注入攻击。
答案 1 :(得分:0)
@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
完全符合您的想法。