Rails ActiveRecord日期之间

我需要查询一天内的评论。该字段是标准时间戳的一部分,是created_at。所选日期来自date_select

如何使用ActiveRecord来做到这一点?

我需要这样的东西:

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

这段代码应该为你工作:

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

要了解更多信息,请查看时间计算

此代码是弃用。如果您使用的是Rails 3.1/3.2,请使用答案中的代码

如果你只想休息一天,这样做会更容易:

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

我个人会创建一个范围,使其更具可读性和可重用性:

在你的评论中。Rb,你可以定义一个范围:

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

然后到查询之间创建:

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

希望能有所帮助。

请注意,目前接受的答案在Rails 3中已弃用。你应该这样做:

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

或者,如果你想要或必须使用纯弦条件,你可以这样做:

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

我运行了这段代码,看看选中的答案是否有效,并且不得不尝试交换日期以获得正确的答案。这个工作,

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

如果您认为产出应该是36,那么考虑一下,先生,3天对3个人来说是多少天?

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

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来查找日期之间的记录,

这个宝石很容易使用,更清楚由明星我使用这个宝石和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)

请查看文档并尝试一下。

我用的是3个点,而不是2个。三个点给你一个开始是开放的,结束是封闭的范围,所以如果你对后面的范围进行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 []>

而且,是的,使用瞄准镜总是很好的!

我认为应该有一个默认的活动记录行为。查询日期很困难,特别是涉及到时区时。

总之,我用:

  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
}

Rails 5.1引入了一个新的日期帮助方法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)