2012-06-13 88 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

這會如何捕獲在窗口之前開始並在窗口之後結束的事件?這樣的事件仍然會與窗口重疊。 –