2011-09-29 48 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) 

照顧是否使用>或> =(分別爲<或< =),這取決於你的數據和要求。