2015-01-15 44 views
1

我有4日期PARAMS event_start, event_end, view_start, view_endRails的查詢篩選通過,如果兩個日期範圍重疊比較

我怎樣寫一個Model.where()(或相應的活動記錄查詢語法),因此,如果任何日期之間event_startevent_endview_startview_end之間的任何日期相同,那麼包括該記錄?

event_startevent_end是我的表中的列(模型上的屬性)。

view_startview_end在params散列中可用。

回答

2

當記錄不被顯示時,只有兩種情況:當view_start大於event_end並且當view_end小於event_start時。 (假定查看日期的順序正確)。由於我們正在尋找的否定,使用德摩根定律:

if view_start < view_end 
    Model.where('event_start < ? AND event_end > ?', view_end, view_start) 
else 
    Model.none 
+1

我喜歡你想出的邏輯。我對event_start和event_end進行了驗證,因此我可以使用If Else語句對嗎?這個答案更好,然後kardeiz回答?對於rails/ruby​​初學者來說,閱讀和理解起來會更容易。 – JerryA 2015-01-15 18:54:56

+0

我試過這個,它工作的很好。 – JerryA 2015-01-15 19:19:33

1

試試這個:

Model. 
    where(Model.arel_table[:event_start].lt(params[:view_end])). 
    where(Model.arel_table[:event_end].gt(params[:view_start])) 

將找到重疊的範圍。根據應用程序處理端點的時間不同,您可能需要將其更改爲例如gteq

+0

這似乎是工作!我必須研究如何。如果日期與包含記錄的日期匹配,我希望它。 BroiSatse的回答是否更好? – JerryA 2015-01-15 18:52:38

+0

如果兩者的結束日期相同,這肯定會匹配。不匹配的是一個的開始日期是否等於另一個的結束日期;如果你想要匹配,那麼你需要爲一個或兩個端點添加「...或等於」。 – 2015-01-15 18:58:51

+0

這與@ BroiSatse的答案非常相似。它只是用'Arel'來形成「大於/小於」的邏輯。我更喜歡在可能的情況下使用Arel,因爲它允許您編寫完全與RDBMS無關的查詢(儘管這可能無關緊要)。 – 2015-01-15 19:03:05