2011-09-29 49 views
2

目前我正在建立一个学校社区网站,我在一个部分有问题是管理员发布他/她想要检查的新事件如果事件开始日期和时间没有冲突也结束日期和在将其保存到数据库之前。我尝试了很多查询,但仍然无法获得确切的SQL。MySQL查询检查事件冲突

我正在使用MySQL服务器5和PHP 5.3。任何人都可以帮助我如何在表上查询我的意思是正确的SQL字符串。

继承人的表中的字段:

  • 事项标识=> INT,
  • EVENT_TYPE =>枚举( '学校', '科'),
  • EVENT_TITLE =>文本,
  • event_details = > LONGTEXT,
  • event_start =>日期时间,
  • event_end =>日期时间,
  • event_added _by => INT,
  • event_modified_on =>日期时间,

这里是我现在所拥有的:

SELECT *, time(event_start) as start_time, time(event_end) as end_time 
FROM `tbl_events` WHERE ((date(event_start) between '2011-12-9' and 
'2011-12-15') AND (time(event_start) between '00:00:00' and 
'01:00:00')) OR ((date(event_end) between '2011-12-9' and 
'2011-12-15') AND 

回答

2

你有四样东西,以查找指示冲突:

  1. 现有活动在活动开始前开始,并在活动结束后结束(您的活动在现有活动内)
  2. an exi刺激事件在事件开始前开始,在事件开始后结束(重叠新事件的开始)
  3. 现有事件在事件结束前开始并在事件结束后结束(重叠结束新事件)
  4. 您的活动开始后
  5. 现有的事件开始,(现有的事件是新事件中)

您的活动结束前结束通过之前和之后,我的意思是在同一时间或前/后(< =和> =)。

+0

您可以稍微简化为3个条件:1)任何现有事件在您的期间开始,2)任何现有事件在您的期间结束,或者3)任何现有事件在您的之前开始并结束。 –

+0

如果管理员在该日期之间添加了问题,那么该如何处理? – naviciroel

+0

只有两个条件。查看其他答案 – michael667

1

有两次检查要做到这一点需要组合成一个条件:

  • 的(现有的),您的活动结束前,事件开始

  • 它结束你的活动开始后。

如果具有这种条件的查询返回行,则会有冲突。

我在这里假设结束时间是事件停止活动(或功能或有效或任何)的时间。也就是说,如果一个事件的开始时间等于另一个事件的结束时间,那么在那里没有冲突。但是,如果考虑你的情况有冲突,后分别以上之前或当后或当更换之前

下面是它看起来可能会查询:

… 
WHERE event_start < @new_event_end 
    AND event_end > @new_event_start 
… 

或者,如果没有event_start应该与其他事件的event_end

… 
WHERE event_start <= @new_event_end 
    AND event_end >= @new_event_start 
… 

(也就是说,只需更换与不严格的严格不等式)

+0

如何在声明中使用BETWEEN?那可能吗? – naviciroel

+0

@naviciroel:如果你的意思是使用'BETWEEN'而不是'> ='或'<='或两者,那么不行,你不能这样做,因为所有四个值都是不同的。将起始值与结束值进行比较,并将不同的结束值与不同的起始值进行比较。当使用'BETWEEN'时,与一些起始值和一些最终值相比,您具有相同的值。所以这是一个不同的事情。 –

1

这也允许开放式结束(以end = null为模型):

WHERE (event2.start < event1.end OR event1.end is null) 
AND (event2.end > event1.start OR event2.end is null) 

照顾是否使用>或> =(分别为<或< =),这取决于你的数据和要求。