Rails的ActiveRecord之间的date

我需要查询一天内发表的评论。 该字段是标准时间戳的一部分,是created_at。 所选date来自date_select。 我怎样才能使用ActiveRecord来做到这一点?

我需要像这样的东西:

"SELECT * FROM comments WHERE created_at BETWEEN '2010-02-03 00:00:00' AND '2010-02-03 23:59:59'" 

只需要注意,目前接受的答案在Rails 3中已被弃用。您应该这样做:

 Comment.where(:created_at => @selected_date.beginning_of_day..@selected_date.end_of_day) 

或者,如果您想要或必须使用纯string条件 ,则可以执行以下操作:

 Comment.where('created_at BETWEEN ? AND ?', @selected_date.beginning_of_day, @selected_date.end_of_day) 

我会亲自创build一个范围,使其更具可读性和可重用性:

在你的Comment.rb中,你可以定义一个范围:

 scope :created_between, lambda {|start_date, end_date| where("created_at >= ? AND created_at <= ?", start_date, end_date )} 

然后查询创build之间:

 @comment.created_between(1.year.ago, Time.now) 

希望它有帮助。

这个代码应该适合你:

 Comment.find(:all, :conditions => {:created_at => @selected_date.beginning_of_day..@selected_date.end_of_day}) 

有关更多信息,请查看时间计算

注意:此代码已被弃用 。 如果您使用Rails 3.1 / 3.2,请使用答案中的代码

 Comment.find(:all, :conditions =>["date(created_at) BETWEEN ? AND ? ", '2011-11-01','2011-11-15']) 

我运行这个代码,看看检查的答案是否正常工作,并且必须尝试交换date才能正确。 这工作 –

 Day.where(:reference_date => 3.months.ago..Time.now).count #=> 721 

如果你认为产量应该是36,那么主席先生,考虑这个问题,3天到3天是多less天?

我一直在使用3个点,而不是2个点。三个点给你一个范围,开始时是打开的,最后是closures的,所以如果你对后面的范围进行2次查询,你不能得到相同的行都。

 2.2.2 :003 > Comment.where(updated_at: 2.days.ago.beginning_of_day..1.day.ago.beginning_of_day) Comment Load (0.3ms) SELECT "comments".* FROM "comments" WHERE ("comments"."updated_at" BETWEEN '2015-07-12 00:00:00.000000' AND '2015-07-13 00:00:00.000000') => #<ActiveRecord::Relation []> 2.2.2 :004 > Comment.where(updated_at: 2.days.ago.beginning_of_day...1.day.ago.beginning_of_day) Comment Load (0.3ms) SELECT "comments".* FROM "comments" WHERE ("comments"."updated_at" >= '2015-07-12 00:00:00.000000' AND "comments"."updated_at" < '2015-07-13 00:00:00.000000') => #<ActiveRecord::Relation []> 

而且,是的,使用示波器总是很好的!

Rails 5.1引入了一个新的date帮助器方法all_day ,参见: https : //github.com/rails/rails/pull/24930

 >> Date.today.all_day => Wed, 26 Jul 2017 00:00:00 UTC +00:00..Wed, 26 Jul 2017 23:59:59 UTC +00:00 

如果您使用的是Rails 5.1,则查询如下所示:

 Comment.where(created_at: @selected_date.all_day) 

如果你只想有一天会更容易这样:

 Comment.all(:conditions => ["date(created_at) = ?", some_date]) 

有几种方法。 你可以使用这个方法:

 start = @selected_date.beginning_of_day end = @selected_date.end_of_day @comments = Comment.where("DATE(created_at) BETWEEN ? AND ?", start, end) 

或这个:

 @comments = Comment.where(:created_at => @selected_date.beginning_of_day..@selected_date.end_of_day) 

您可以使用以下gem来查找date之间的logging,

这个gem相当容易使用和更清楚明星是使用这个gem和API更清晰,文件也很好地解释。

 Post.between_times(Time.zone.now - 3.hours, # all posts in last 3 hours Time.zone.now) 

在这里你可以通过我们的领域Post.by_month("January", field: :updated_at)

请参阅文档并尝试。

在这个我应该有一个默认的活动logging行为。 查询date很困难,特别是涉及时区时。

无论如何,我使用:

  scope :between, ->(start_date=nil, end_date=nil) { if start_date && end_date where("#{self.table_name}.created_at BETWEEN :start AND :end", start: start_date.beginning_of_day, end: end_date.end_of_day) elsif start_date where("#{self.table_name}.created_at >= ?", start_date.beginning_of_day) elsif end_date where("#{self.table_name}.created_at <= ?", end_date.end_of_day) else all end }