我有一個包含order_date
datetime列的訂單表。需要在特定時間範圍內的所有日期提取記錄的查詢。Rails 4 ActiveRecord查詢時間
示例:在東部時間上午7點到上午9點之間的所有日期提取訂單。
喜歡的東西:
Order.where('time(order_date) BETWEEN ? AND ?', '7am', '9am')
開始和結束時間是從文本字段來這裏用戶可以輸入凌晨2點,下午3點,早上6點等字符串值
我有一個包含order_date
datetime列的訂單表。需要在特定時間範圍內的所有日期提取記錄的查詢。Rails 4 ActiveRecord查詢時間
示例:在東部時間上午7點到上午9點之間的所有日期提取訂單。
喜歡的東西:
Order.where('time(order_date) BETWEEN ? AND ?', '7am', '9am')
開始和結束時間是從文本字段來這裏用戶可以輸入凌晨2點,下午3點,早上6點等字符串值
試試這個
Order.where(order_date: Time.parse("7am")..Time.parse("9am"))
這似乎是不正確的,因爲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在任何一天都需要訂單地點。 –
使用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月前之間。
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')
EXTRACT
您可以使用EXTRACT
從order_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_hour
和end_hour
(一些其他問題例如-1一個小時無效)。
這種方法很簡單,但限於整小時(您可以添加分鐘和秒,但方法會變得複雜)。
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')
。
我不想在日期之間進行搜索,而只是在兩次之間進行查詢,即每天僅在上午7點到上午9點之間進行查詢 – Arif
什麼是您的數據庫? –
我正在使用Postgresql – Arif