Rails ActiveRecord – 如何在两个日期之间获取记录

我在数据库中有两个日期列 – from_dateto_date

例:

  • from_date : 2012-09-10
  • to_date2012-09-30
  • today2012-09-13

如果today的日期在from_dateto_date之间,我需要获取所有记录。 如何在SQL查询中执行此操作?

如果我已经加载了相应的记录,我可以很容易地决定,如果今天的日期在from_dateto_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)