1

我有一个数据库,人们可以在其中两个特定时间内预订房间,但可能有其他人在同一时间搜索可用房间 - 或部分在同一时间。

数据库如下所示:

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 更容易管理我也会很高兴:-)

4

2 回答 2

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并允许预订背靠背。如果您不想让预订背靠背更改<and><=and =>

重要提示:确保不要只使用字符串插值并插入未转义的用户提供的输入,因为这会使您的应用程序容易受到 SQL 注入攻击。

于 2013-04-04T10:16:37.513 回答
1

@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完全按照您的想法进行。

于 2013-04-04T10:44:01.013 回答