我想在我要求的新时期内随时查找行。
这是我的表数据,其中包含现有行:
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_time
和end_time
字段。
$sql = 'SELECT * FROM int_low_events WHERE start_date = "2014-04-03"';
答案 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中构建解决方案而不必修改数据库逻辑。