Rails ActiveRecord – 如何在两个日期之间获取记录
我在数据库中有两个日期列 – from_date
和to_date
。
例:
-
from_date
: 2012-09-10 -
to_date
: 2012-09-30 -
today
: 2012-09-13
如果today
的日期在from_date
和to_date
之间,我需要获取所有记录。 如何在SQL查询中执行此操作?
如果我已经加载了相应的记录,我可以很容易地决定,如果今天的日期在from_date
和to_date
之间,但我不知道,如何从数据库中直接获取这些记录。
data = ModelName.where("today >= from_date AND today <= to_date")
检查范围条件下的Rails指南 :
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')
你可以像这样使用:
Data = Model.where("date(now()) between from_date and to_date")
data = ModelName.find(:all, :conditions => "today >= from_date and today <= to_date")
这应该可以解决问题。
today = Date.today data = ModelName.where("from_date <= ? AND to_date >= ?", today, today)
您可以使用以下gem来查找日期之间的记录,
这个gem相当容易使用,更清晰明星我使用这个gem和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)
请参阅文档并试用它。
好吧,经过长时间搜索谷歌寻找“导航方式”来做两个日期字段和变量的BETWEEN后,我找到的最近似的解决方案是创建自己的范围来做到这一点。
在您的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)
您可以将其与其他人“where”结合使用,根据需要进行查询。
一个安全,简单的方法是:
Model.where(':date BETWEEN from_date AND to_date', date: Date.today)