2014-10-08 106 views
1

我已經插上了這個。這將是一個簡單的小數學邏輯問題。但是對於我的生活,我無法讓它正常運作。ColdFusion 9 - SQL語句 - 布爾邏輯

試圖避免預訂系統中的重複預訂的東西。當前代碼...

and schdate = #createODBCDate(schdate)# 
    and (schstart >= #createODBCTime(stime)# and 
     actend <= #createODBCTime(actend)# 
    ) 

基本上嘗試做一次檢查 - 如果說開始的時間是下午2日期和下午3時結束...... 我需要檢查,如果我想訂一些重疊.. 。說試着在下午2:15預訂... 它應該踢出檢查說 - 衝突。

所以認爲這是數學邏輯的事情 - 而不是一個ColdFusion的事......只是一個空的大腦今天...

感謝名單鉛 - 我想我可能已經想通了 - 仍在測試......看起來下方正在工作。開發鏈接提供了見解。

 and schdate = #createODBCDate(schdate)# 
    and schstart < #createODBCTime(actend)# 
    and actend > #createODBCTime(stime)# 
+0

而不存在(子查詢來檢測現有記錄)是你的朋友。 – 2014-10-08 21:34:10

+0

'不存在'將適用於相反檢查,即如果*不存在衝突。 – Leigh 2014-10-08 21:43:01

+0

(編輯)第二個想法,我跑了一個快速測試,我認爲這將做到這一點。做得好! – Leigh 2014-10-08 22:27:28

回答

1

UPDATE:

低於原始查詢Merle_the_Pearl's revision是一個更直觀一點。基本上扭轉了比較:

WHERE DateColumn = #RequestedDate# 
AND  StartTimeColumn < #RequestedEndTime# 
AND  EndTimeColumn > #RequestedStartTime# 

我記得看到關於這一主題的大螺紋:Finding overlapping dates。 (ASCII插圖是一個很好的觸摸:)。假設你的預訂沒有跨越多天,它也應該適用於很多時候。

通常的方法是檢查各類型的衝突:

  • 重疊:即要求9-10AM,但已經有9保留:30-11AM
  • 瀑布內:即要求的時間是10-11AM,但有一個爲9-12PM
  • 包括現有保留:即要求的時間是12-5PM,但有一個爲2-3PM

現有保留鏈接提到了一個更優雅做法。從本質上講,它將所有這些步驟都減少爲單個過濾器。

WHERE FE >= SD and FS <= ED 

如果發現匹配,就知道存在衝突。翻譯應該看起來像這樣(未經測試)。

SELECT Columns 
FROM SomeTable 
WHERE #RequestedEndTime# >= StartTimeColumn 
AND  #RequestedStartTime# <= EndTimeColumn 
AND  DateColumn = #RequestedDate# 

注:我特意爲清楚起見,省略cfqueryparam。很顯然,我會建議在實際查詢中使用它。