2017-08-01 124 views
1

我需要對數據庫進行查詢並按開始日期篩選Event,但列類型爲DateTime。 我做模型範圍:Rails在'where'查詢中將日期時間轉換爲日期

scope :day, -> (start_date) {where start_date: start_date} 

它工作正常的相同日期時間價值,但我需要一個過濾器,以獲得Event只有日期,沒有日期時間。

我有PG數據庫,並嘗試:

scope :day, -> (start_date) {where("start_date:date =?", "#{start_date.to_date}")} 

,但我得到一個錯誤

+0

威爾這樣的事情對你的工作:'這裏('DATE(啓動)=?',start_date.to_date)'你在Rails 5.1嗎? – Deep

回答

4

如果您希望將數據庫值轉換爲一個日期,你必須對不同的數據庫服務器做不同的事情像MySQL的下列內容:

scope :day, -> (start_date) {where("DATE(start_date) = ?", start_date)} 

因此可能更明智的您的起始日期參數轉換爲日期時間:

scope :day, -> (start_date) {where start_date: start_date.to_datetime} 

此外,BigRon posted一個很好的方法來開始和一天的結束,深posted爲Rails 5.1的輔助,可以簡化這一做法進一步之間的過濾器,但你真的應該考慮你的數據庫列是否需要實際日期時間,如果你想單獨過濾日期。

+0

謝謝,數據庫字段必須有日期時間類型,因爲在此字段中我存儲開始日期和開始時間 – dendomenko

2

您可以使用範圍的一天開始到一天結束:

scope :day, -> (start_date) {where start_date: start_date.beginning_of_day..start_date.end_of_day} 
7

你可以做這樣的:

使用SQL日期函數(依賴於數據庫,這是爲MySQL):

scope :on_day -> (start_date) { where("DATE(start_date) = ?", start_date.to_date) } 

或者使用範圍(所以這將檢查使用的日期和時間都只是用一天的開始和結束時間和執行BETWEEN q uery):

scope :day, -> (start_date) { where start_date: start_date.beginning_of_day..start_date.end_of_day } 

或者如果的Rails 5.1(這是Rails的5.1引入了新的幫手):

scope :day, -> (start_date) { where start_date: start_date.all_day }