【问题标题】:Reservation system renting a block of a day预订系统租用一天一个街区
【发布时间】:2012-04-26 08:30:29
【问题描述】:

我在使用我必须构建的预订系统 (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)

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

提前致谢。

编辑示例查询:

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 个区块可供用户领取钥匙。

【问题讨论】:

  • 您的查询看起来如何,哪里出错了?
  • 查询示例:SELECT * FROM reservations WHERE ( start_date &gt;= " . $start_block_1 . " AND end_date &lt;= " . $end_block_1. ") OR (start_date &gt;= " . $end_block_1. " AND end_date &lt;= " . $start_block_1. ") $start_block_1 和 $end_block_1 代表一天中的 00:00:00 - 06:00:00 个区块
  • 您是否在start_dateend_date 列中存储日期+时间?那么这是一个简单的查询。
  • 它存储为时间戳是

标签: php mysql datetime timestamp


【解决方案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 代码传入的数据替换它们。

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

【讨论】:

  • d1 和 d2 是 php 变量,@d1 是当前块的 start_timestamp 开始吗?
  • @d1@d2 是用户选择的开始和结束日期时间(“用户 2 想要租用”日期)。如果查询返回一行或多行,则间隔不可用,否则可用。
  • 你先生,让我开心。最后我仍然使用 d1(start_timestamp) 和 d2 (end_timestamp) 作为时间戳,它完成了工作。我不能说我多么感谢你的帮助!谢谢!
猜你喜欢
  • 2022-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-22
  • 2020-10-03
  • 2012-05-05
相关资源
最近更新 更多