Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP/MySQL-检查双人会议室预订_Php_Sql - Fatal编程技术网

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

PHP/MySQL-检查双人会议室预订,php,sql,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\u time和end

我想在我请求的新时段内的任何时间查找行

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

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\u time
end\u time
字段

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

我想您的表中有I字段
日期

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

下面是一个检查两个事件是否重叠的方法:您可以在两个事件之间使用
,如下所示:

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
这将适用于少于一天的事件,如数据库屏幕截图中的事件

您可能需要调整它以适应一天以上的活动

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)
这与我之前的(工作)答案完全相同,但(在我看来)更容易理解。此外,您现在不必到处填写建议的开始和结束日期,只需填写一次(
…建议的开始日期
…建议的结束日期

这确实符合您的数据库设计


它需要非常复杂,因为它需要获取在新提议的事件发生时运行的任何事件

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


然而,ID62也跨越了这个时间段,但开始较早,结束较晚。在新的查询中,这也将被选中(如果这对您有意义的话)。

因此,尽管这是一个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中,而不必修改数据库逻辑。

开始日期
结束日期
是否定义为日期时间?表结构:我无法更改表结构。我需要检查重叠事件,然后根据新事件日期添加新事件,开始时间和结束时间。因此,新事件详细信息为:2014-04-03,开始时间为12:30:00,结束时间为13:30:00。我需要找到重叠的Rowshmm。我已经在SQL Fiddle中设置了我的表,因此它与我的仅设置的笔记本电脑相匹配。行数:我的SQL查询的行数为0,此时应该有1行重叠。找不到行,因为im测试所针对的事件已记录了多天。是否可以添加多天检查?当事件持续多天时,会有点困难。我将为此组装一些东西。现在正在进行的一些混乱的事情,我将在午餐休息后对其进行增强,但至少它已经开始工作了。在我几乎不懂SQL的情况下告诉我使用ADDTIME对我没有帮助。我将SQL查询复制并粘贴到PHP字符串中并运行它……首先,我不是学生。其次,我没有要求你做我的工作。我来到这里是为了在一个我在MySQL方面知识薄弱的领域寻求帮助。如果我试着自己做这件事,我将一事无成,很可能会放弃!我不像你那样“无所不知”。至少有了Padarom提供的答案,我可以将解决方案分解并从中学习。谢谢你的帮助!对于那些想知道为什么我不能改变DB结构的人来说,是因为我在使用第三方PHP插件,但是我需要扩展PHP,在预订新的活动之前做额外的检查。
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