2012-04-26 55 views
2

我在使用我必须建立的预订系统(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是否可以租到工作室,直到最大27日4月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天连续现在,仍然无法破解它。我认为解决方案很简单,但我可能在错误的方向搜索。

在此先感谢。

EDIT例如queryie:

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 - 一天的六点00分00秒块。

我执行此查询4次,因为在用户可以拾取密钥的当天有4个块。

+0

您的查询如何查看以及它们出错的位置? – 2012-04-26 08:34:37

+0

实施例的查询:( “$ start_block_1”“。$ end_block_1 ”起始日期> = \t \t \t \t日期和结束日期<=)'SELECT * FROM保留WHERE \t \t \t OR(起始 \t \t \t> =“ 。。$ end_block_1 “ \t \t \t \t日期和结束日期<=” $ start_block_1“)'的$ start_block_1和$ end_block_1代表** 00:00:00 - 06:00: – 2012-04-26 08:37:56

+0

一天的00 **块你是否在'start_date'和'end_date'列中存储了日期和时间?这是一个简单的查询。 – 2012-04-26 08:41:47

回答

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代码传入的数据。

注意:比较运算符<<=可能需要根据开始/结束日期时间是包含还是排除来进行更改。

+0

是d1和d2的php变量和@ d1开始当前块的start_timestamp? – 2012-04-26 09:06:15

+0

'@ d1'和'@ d2'是用户选择的开始和结束日期(“用户2想要租用”日期)。如果查询返回一个或多个行,则该间隔不可用。 – 2012-04-26 09:10:16

+0

你先生,我的一天。最后,我仍然使用d1(start_timestamp)和d2(end_timestamp)作为时间戳,并完成了工作。 我不能说我多么感谢你的帮助!谢谢! – 2012-04-26 15:38:01