租用一天的预订系统

时间:2012-04-26 08:30:29

标签: php mysql datetime timestamp

我无法使用我必须构建的预订系统来验证日期(PHP / Mysql)。 我之前发布了一个类似的问题Reservation system dates但事情发生了变化。

我遇到的问题; 我们在办公室有一个工作室/会议室。这是在有限的时间范围内出租。用户选择他希望租用房间的日期,时间和小时数。

一步一步预订:

1-用户选择他想租用工作室的月份。 2-用户选择他想租用工作室的那一天。 (这里我卡住了) 3-用户选择他希望获得密钥的时间。

密钥可接收的时间:

00:00:00 - 06:00:00
06:00:00 - 12:00:00
12:00:00 - 18:00:00
18:00:00 - 24:00:00

这些时间是用户将收到门钥匙的时间。

4-用户选择他希望租用工作室的小时数。

问题: 我可以查看工作室租用的日期,但不确定时间。 我知道如何在PHP中检查时间。但是例如;

用户1于2012年4月27日从12:00:00至18小时租用工作室。 用户2希望在2012年4月26日18:00:00至12小时之前租用工作室。 用户3希望在4月28日租用该工作室。

我怎样才能检查用户2是否可以在工作室之前租用工作室,直到截至4月27日12:00:00。 如何检查用户3是否可以在28日租用工作室并确保它在06:00之后可用。

数据库:

id                 int(11)
user_id             int(11)
rental_name         varchar(255)
key_receive_time varchar(255)
start_date         int(11)
end_date         int(11)
total_hours      int(11)

我已经连续两天在这里,但仍然无法破解它。我想解决方案很简单,但我可能会朝错误的方向搜索。

提前致谢。

编辑示例查询:

SELECT * FROM reservations
WHERE (start_date >= " . $start_block_1 . " AND end_date <= " . $end_block_1   . ")
OR    (start_date >= " . $end_block_1   . " AND end_date <= " . $start_block_1 . ")

$start_block_1$end_block_1代表 00:00:00 - 06:00:00 时段的时间戳。

我执行此查询4次,因为当天有4个块可供用户取钥。

1 个答案:

答案 0 :(得分:1)

好像你需要检查一个间隔 - 一对开始和结束日期 - 是否与数据库中的现有间隔冲突。如果这是你想要的,那么这里是查询:

-- //// FOR TESTING \\\\
CREATE TABLE reservations (start_date INT, end_date INT);

INSERT INTO reservations(
    start_date,
    end_date
)
VALUES (
    UNIX_TIMESTAMP('2012-04-27 12:00:00'), -- start date booked by user 1
    UNIX_TIMESTAMP('2012-04-28 06:00:00')  -- end date booked by user 1
);

SET @d1 = UNIX_TIMESTAMP('2012-04-26 18:00:00'); -- start date requested by user 2
SET @d2 = UNIX_TIMESTAMP('2012-04-27 06:00:00'); -- end date requested by user 2
-- \\\\ FOR TESTING ////

SELECT 1
FROM reservations
WHERE
(@d1        <= start_date AND start_date <  @d2     ) OR -- start datetime lies "inside" the interval
(@d1        <  end_date   AND end_date   <= @d2     ) OR -- end datetime lies "inside" the interval
(start_date <= @d1        AND @d2        <= end_date)    -- the interval itself lies inside start and end datetime

查询将返回与给定间隔冲突的行。变量@d1@d2用于在mysql客户端中测试您的查询;用从PHP代码传入的数据替换它们。

注意:可能需要更改比较运算符<<=,具体取决于您的开始/结束日期时间是包含还是排他。