2012-06-13 50 views
0

我有PHP和MySQL的一个简单的日历阻塞事件,它存储在一个简单的格式事件:Mysql数据库设计,在日历上

id int 
name varchar  
start datetime 
end datetime 

我需要做的,并不能找到一个可靠这样做的方法是“阻止”某个时间段,以便在该时间段内不能有任何其他事件。

我试图找到基本上是MySQL查询,以检查新选择的时间段被占用:

如果我走了这条路:

SELECT * FROM events WHERE new_event_start => start AND new_event_end =< end; 

它未能找到事件在new_event_start之前开始并在new_event_end

之后开始任何想法?

+0

你能告诉我们更多关于你的设计吗?表格行的存在是否意味着时间被占用?或者,你是否有一排,其个别领域或领域表明时间被占领? – octopusgrabbus

+0

是的,行的存在意味着该行的日期时间“开始”和“结束”之间的时间范围被占用,并且必须是唯一的......所以我试图找到查询表的最佳方式在插入新行之前占用时间... –

回答

1

这是一个逻辑问题,而不是语言或技术问题。

你需要测试几种情况:

End of new event is between the beginning and end of blocked period 
OR 
Beginning of new event is between the beginning and end of blocked period 
OR 
Beginning of new event is before the beginning of the blocked period and the end is after the end of the blocked period 

,将捕获,将重叠的封锁期间的所有事件。

+0

尼斯,所以... SELECT * FROM 事件 WHERE OR(开始和结束之间new_event_end)(开始和结束之间new_event_start) OR(new_event_start <= START和new_event_end> =端); 我正确吗? –

+0

出于某种原因,我的代码不会显示为代码,即使我缩进四个空格时也是如此。 –

+0

是的,这是正确的,因为被阻止的时间段受“开始”和“结束”限制,并且新事件有界'new_event_start'和'new_event_end'。 –

0

在哪里使用OR。

SELECT * FROM事件WHERE(new_event_start =>启动和new_event_end = <末)OR(new_event_start < =启动和new_event_end> =结束)OR ...

0

试试这个

select count(*) from events 
where (start between new_event_start and new_event_end) 
OR (end between new_event_start and new_event_end); 
+0

这会如何捕获在窗口之前开始并在窗口之后结束的事件?这样的事件仍然会与窗口重叠。 –