用于检查事件冲突的MySQL查询

时间:2011-09-29 21:43:24

标签: mysql sql database

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

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

表格字段:

  • event_id =>整型,
  • event_type =>枚举( '学校', '部门'),
  • EVENT_TITLE =>文本,
  • event_details => longtext,
  • event_start =>日期时间,
  • event_end =>日期时间,
  • event_added_by =>整型,
  • 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

3 个答案:

答案 0 :(得分:2)

您有四件事需要注意,表明存在冲突:

  1. 现有活动在活动开始前开始,在活动结束后结束(活动在现有活动内)
  2. 现有活动在活动开始前开始,在活动开始后结束(重叠新活动的开头)
  3. 现有活动在活动结束前开始,在活动结束后结束(重叠新活动结束)
  4. 现有活动在您的活动开始后开始,在活动结束前结束(现有活动在新活动内)
  5. 之前和之后,我的意思是同时或之前/之后(< =和> =)。

答案 1 :(得分: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
…

(也就是说,简单地用非严格的不等式替换严格的不等式。)

答案 2 :(得分:1)

这也允许开放式结尾(由end = null建模):

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

注意是否使用&gt;或&gt; =(分别&lt;或&lt; =),这取决于您的数据和要求。