2016-12-27 73 views
1

我有一個包含order_date datetime列的訂單表。需要在特定時間範圍內的所有日期提取記錄的查詢。Rails 4 ActiveRecord查詢時間

示例:在東部時間上午7點到上午9點之間的所有日期提取訂單。

喜歡的東西:

Order.where('time(order_date) BETWEEN ? AND ?', '7am', '9am') 

開始和結束時間是從文本字段來這裏用戶可以輸入凌晨2點,下午3點,早上6點等字符串值

+0

我不想在日期之間進行搜索,而只是在兩次之間進行查詢,即每天僅在上午7點到上午9點之間進行查詢 – Arif

+0

什麼是您的數據庫? –

+0

我正在使用Postgresql – Arif

回答

2

試試這個

Order.where(order_date: Time.parse("7am")..Time.parse("9am")) 
+0

這似乎是不正確的,因爲Ruby中的Time是日期和時間。我測試了它在本地不正確。 * FROM「teachers」WHERE(「teachers」。「created_at」BETWEEN $ 1 AND $ 2)''和'[[「created_at」,2017-01-03 06:00:00 UTC] ,[「created_at」,2017-01-03 08:00:00 UTC]]'被替換。您的查詢在上午7點到上午9點之間選擇_today_。 @Arif在任何一天都需要訂單地點。 –

1

使用MySQL HOUR功能:

Order.where("HOUR(order_date) between 7 and 9") 

請注意查詢時使用的時區!如果你需要一個字符串轉換像"9am"爲對象

Order.where('order_date < ?', Time.now).where('order_date > ?', Time.now - 1.month) 

使用Time#parse

1

舉個例子,這將搜索訂單現在和1月前之間。

irb(main):006:0> Time.parse('9 AM') 
=> 2016-12-27 09:00:00 -0700 

最後的代碼可能會是這個樣子:

morning = Time.parse('9 AM') 
# 2016-12-27 09:00:00 -0700 

night = Time.parse('10 PM') 
# 2016-12-27 22:00:00 -0700 

Order.where('order_date > ?', morning).where('order_date < ?', night) 


Order Load (0.2ms) SELECT `orders`.* FROM `orders ` WHERE (order_date > '2016-12-27 16:00:00.000000') AND (order_date < '2016-12-28 05:00:00.000000') 
1

方法1:EXTRACT

您可以使用EXTRACTorder_date拿到小時:

Order.where('EXTRACT(hour FROM order_date) BETWEEN ? AND ?', 7, 20) 

請注意,我指定了20(晚上8點)作爲上限。如果我使用21然後order_date與時間組件21:30將匹配哪些不是我們想要的。

你可以在一個範圍內包裹上面的查詢:

class Order < ActiveRecord::Base 
    scope :between, -> (start_hour, end_hour) { 
    where('EXTRACT(hour FROM order_date) BETWEEN ? AND ?', start_hour, end_hour - 1) 
    } 
end 

也有可能會喜歡解決,例如檢查有效的值start_hourend_hour(一些其他問題例如-1一個小時無效)。

這種方法很簡單,但限於整小時(您可以添加分鐘和秒,但方法會變得複雜)。

方法2:顯式的time

Time在Ruby中同時存儲日期和時間。例如:

Time.parse('15:30:45') # => 2017-01-02 15:30:45 +0100 

你可以通過Time到PostgreSQL和它轉換爲Postgres的time類型明確:

class Order < ActiveRecord::Base 
    scope :between, -> (start_time, end_time) { 
    where('order_date::time BETWEEN ?::time AND ?::time', start_time, end_time) 
    } 
end 

這種方法的優點是靈活性。缺點是在處理用戶界面的時間方面更加複雜。範圍需要一對Time對象。有很多方法可以獲得它們,例如:Time.parse('12:17')