2012-09-13 40 views
16

我在數據庫中有兩個日期列 - from_dateto_dateRails ActiveRecord - 如何在兩個日期之間取數據

實施例:

  • from_date2012年9月10日
  • to_date2012-09-30
  • today2012年9月13日

我需要提取所有記錄如果today的日期在from_dateto_date之間。如何在SQL查詢中做到這一點?

如果我已經加載相應的記錄,我可以很容易地決定,如果今天的日期介於from_dateto_date之間,但我不知道,如何從數據庫中直接取出這些記錄。

+1

我認爲這個問題可能會有所幫助:Rails的ActiveRecord的之間的日期](http://stackoverflow.com/a/2381825/722783) –

回答

18
data = ModelName.where("today >= from_date AND today <= to_date") 
+5

這個答案實際上比Paulo的更普遍。 Paulo的查詢假定你有一個字段(在他的答案中是'created_at'),你期望在兩個日期之間有一個字段。如果我想查看今天是否在'start_date'和'end_date'之間呢?不能用Paulo的答案來做到這一點。 – Sebastialonso

4
data = ModelName.find(:all, :conditions => "today >= from_date and today <= to_date") 
42

檢查Rails guides的範圍條件:

Client.where(created_at: (Time.now.midnight - 1.day)..Time.now.midnight) 

這將產生如下SQL:

SELECT * FROM clients WHERE (clients.created_at BETWEEN '2008-12-21 00:00:00' AND '2008-12-22 00:00:00') 
+15

這實際上並不回答問題。他想知道日期在兩個單獨列的值之間,這是列在兩個日期之間的位置。 –

1

你可以使用下面的寶石來查找日期之間的記錄,

This ge m很容易使用,更清晰By star上午使用這個寶石和API更清晰,文檔也很好地解釋。

ModelName.between_times(Time.zone.now - 3.hours, # all posts in last 3 hours 
        Time.zone.now) 

在這裏,您可以通過我們的現場也ModelName.by_month("January", field: :updated_at)

請參閱文檔和嘗試。

2

這應該可以做到。

today = Date.today 

data = ModelName.where("from_date <= ? AND to_date >= ?", today, today) 
6

你可以使用這樣的:

Data = Model.where("date(now()) between from_date and to_date") 
1

好,之後在谷歌經過長時間的搜尋尋找「導軌方式」有兩個日期字段和可變,最大約做了BETWEEN我找到的解決方案是創建自己的scope來做到這一點。

在ApplicationRecord寫

class ApplicationRecord < ActiveRecord::Base 

    scope :between_fields, -> (value, initial_date, final_date) { 
    where "('#{value}' BETWEEN #{initial_date} AND #{final_date})" 
    } 

end 

所以,現在,無論你需要做一個你們之間可以做:

@clients = Client.between_fields(params[:date], :start_date, :final_date) 
# SELECT * FROM clients WHERE ('2017-02-16 00:00:00' BETWEEN start_date AND final_date) 

您可以與他人「這裏的」做你的查詢結合起來具體如你所需。

+1

範圍是一個很好的方法來做到這一點,但使用字符串插值對安全性來說是一個壞主意。 您不應該在查詢中使用'#{string}'語法,尤其是當您從params直接傳遞時! –

1

做一個安全,簡便的方法,這將是:

Model.where(':date BETWEEN from_date AND to_date', date: Date.today) 
相關問題