PHP / MySQL - 检查双人会议室预订

时间:2014-04-04 09:34:57

标签: php sql

我想在我要求的新时期内随时查找行。

这是我的表数据,其中包含现有行:

https://www.dropbox.com/s/1s4y8tl6s09emim/Screenshot%202014-04-04%2009.52.24.png

这是我要求的新时期:

Date: 2014-04-03 
Start Time: 12:30:00
End Time: 13:30:00

在我申请的新时间段内,任何时候找到任何现有行的正确SQL是什么?

到目前为止,我有这个但不确定start_timeend_time字段。

$sql = 'SELECT * FROM int_low_events WHERE start_date = "2014-04-03"';

4 个答案:

答案 0 :(得分:2)

我想你在我的表中有date字段:

 $sql = 'SELECT * FROM int_low_events WHERE date between '2014-04-03 12:30:00' and '2014-04-03 13:30:00'";

答案 1 :(得分:1)

SELECT *, 
       ADDTIME(start_date, start_time) AS start,
       ADDTIME(end_date, end_time) AS end,
       '2014-04-03 14:00:00' AS proposed_start,
       '2014-04-03 16:05:00' AS proposed_end
  FROM int_low_events
HAVING (start BETWEEN proposed_start AND proposed_end OR end BETWEEN proposed_start AND proposed_end)
    OR (proposed_start BETWEEN start AND end OR proposed_end BETWEEN start AND end)

这与我以前的(工作)答案完全相同,但它(在我看来)更容易理解。此外,您现在不必在任何地方填写建议的开始日期和结束日期,而只需填写一次(... AS proposed_start... AS proposed_end)。

根据this SQLFiddle的数据库设计,这确实有效。


它需要如此复杂,因为它需要获取在提议事件发生时运行的任何事件。

id | start_date | start_time | end_date   | end_time
---+------------+------------+------------+-----------
62 | 2014-04-03 | 12:00:00   | 2014-04-05 | 13:00:00
63 | 2014-04-03 | NULL       | 2014-04-04 | NULL
64 | 2014-04-03 | 16:00:00   | 2014-04-03 | 17:00:00
65 | 2014-04-03 | 16:30:00   | 2014-04-03 | 17:30:00
66 | 2014-04-03 | 21:30:00   | 2014-04-03 | 22:30:00

这是数据库中重要的部分。假设我们有一个新事件,其日期如下:2014-04-03 16:00 - 2014-04-03 18:00。使用我之前的查询,它只选择了ID 64和65(因为它们都有新事件中的start_datetime或end_datetime。)

然而,ID 62也会跨越这段时间,但会提前开始,之后会结束。使用新查询时,也会选择此选项(如果这对您有意义的话)。

答案 2 :(得分:0)

以下是检查两个事件是否重叠的想法:您可以像这样使用BETWEEN

SELECT a.event_id, b.event_id 
FROM int_low_events AS a, int_low_events AS b
WHERE b.site_id = a.site_id AND
b.start_date = a.start_date AND
b.start_time BETWEEN a.start_time and a.end_time

这将在不到一天的时间内用于事件,就像数据库屏幕截图中那样。

您可能需要在一天以上的时间内对事件进行调整。

答案 3 :(得分:0)

所以尽管这被称为PHP问题,但它实际上是一个数据库问题? ; - )

希望您的日期时间组合已经在表格中编码为日期时间字段,而不是两个单独的日期和时间字段。如果不是这种情况,那么我强烈建议您构建一个将这两个字段合并为一个视图的视图。大大简化了SQL和维护成本(适用于将来尝试修改的任何人)。

如果您不这样做,那么在搜索跨越几天的事件时您将遇到严重问题,这一点在本页的其他答案中很明显。

此外,您需要将传入的请求更改为日期 - 时间组合。您可以在绑定到SQL变量之前在PHP代码中执行此操作。

SQL然后看起来像这样......

select *
from   int_low_events a
where  :proposed_start_datetime not between a.start_datetime and a.end_datetime
  and  :proposed_end_datetime not between a.start_datetime and a.end_datetime

- 编辑 - 根据您拥有所有这些的数据库,有不同的方法来组合日期和时间字段。如果您正在使用MySQL,请使用ADDTIME()。其他数据库将有自己的方法做同样的事情,因此允许您在SQL中构建解决方案而不必修改数据库逻辑。