使用php检查mysql中的时间戳冲突

时间:2013-10-24 17:00:29

标签: php mysql sql date datetime

我想使用mysql和php检查日期和时间冲突。

我的时间戳是使用php代码格式化的,例如:

$timestamp_start = date("Y-m-d H:i:s", mktime(date("H", strtotime($start_time)), date("i", strtotime($start_time)), 0, $date[0], $date[1], $date[2]));
$timestamp_end = date("Y-m-d H:i:s", mktime(date("H", strtotime($end_time)), date("i", strtotime($end_time)), 0, $date[0], $date[1], $date[2]));

我会像下面这样进行mysql检查:

$sql = "SELECT * FROM `$info[table]` WHERE ((`timestamp_start` BETWEEN '$timestamp_start' AND '$timestamp_end') OR (`timestamp_end` BETWEEN '$timestamp_start' AND '$timestamp_end'))";

这是我从这里得到的代码!哈哈。

现在问题是,如果房间安排在2013年10月31日上午08:00到下午05:00,而其他人试图安排在2013年10月31日下午5:00到09:下午00点,他们收到一条消息,说明房间已经在使用中。现在我起初并不介意这一点,因为它迫使房间至少有30分钟的事件间隙,但我的老板说房间应该能够安排背靠背。

我如何修改我的sql语句,允许有人在05:00 PM预订房间,如果一直预订到05:00 PM?

这似乎有效

$sql = "SELECT * FROM `$info[table]` WHERE `approved`='true' AND (`timestamp_start` < '$timestamp_end' AND `timestamp_end` > '$timestamp_start')";

2 个答案:

答案 0 :(得分:1)

BETWEEN是包容性操作,例如

 foo BETWEEN bar AND baz

相当于

 (foo >= bar) AND (foo <= baz)

由于你想在截止时间上允许“重叠”,你将不得不放弃“BETWEEN”操作,并选择更乏味的写出

 (foo >= bar) AND (foo < baz)
                       ^--- non-inclusive

答案 1 :(得分:0)

在此处提出的另一个问题上找到了这个:

$sql = "SELECT * FROM `$info[table]` WHERE `approved`='true' AND (`timestamp_start` < '$timestamp_end' AND `timestamp_end` > '$timestamp_start')";

它似乎正在使用我做的有限测试。