Rails ActiveRecord之间的日期

rta*_*oni 160 ruby-on-rails ruby-on-rails-2 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'"
Run Code Online (Sandbox Code Playgroud)

ndb*_*ent 381

请注意,在Rails 3中不推荐使用当前接受的答案.您应该这样做:

Comment.where(:created_at => @selected_date.beginning_of_day..@selected_date.end_of_day)
Run Code Online (Sandbox Code Playgroud)

或者,如果您想要或必须使用纯字符串条件,您可以:

Comment.where('created_at BETWEEN ? AND ?', @selected_date.beginning_of_day, @selected_date.end_of_day)
Run Code Online (Sandbox Code Playgroud)

  • +1这很美.end_of_day保存我的"结束日". (13认同)
  • +1我们也可以使它成为一个范围:`范围:之间, - >(a,b){where(created_at:a..b)}` (10认同)
  • Day.where(:reference_date => 6.months.ago..Time.now)有效,谢谢 (8认同)
  • 这不会创造一个巨大的范围对象吗? (4认同)
  • @KasperGrubbe @Dex这不是Rails.Ruby中的Range类只保存下限和上限.这在irb中运行良好:`1..1000000000000`我不清楚'你自己使用范围'是什么意思 (4认同)
  • @KasperGrubbe如果您自己使用范围,但Rails只使用第一个和最后一个值 (3认同)

Mar*_*hen 45

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

在Comment.rb中,您可以定义范围:

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

然后查询之间创建:

@comment.created_between(1.year.ago, Time.now)
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你.

  • 非常干净的方法......完美!! (4认同)

Iru*_*dji 23

此代码应该适合您:

Comment.find(:all, :conditions => {:created_at => @selected_date.beginning_of_day..@selected_date.end_of_day})
Run Code Online (Sandbox Code Playgroud)

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

注意:不推荐使用此代码.如果您使用的是Rails 3.1/3.2,请使用答案中的代码

  • 我喜欢这种方法而不是接受的答案,因为它不依赖于db-level`date()函数; 它可能更多数据库独立. (2认同)

Bis*_*ark 23

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
Run Code Online (Sandbox Code Playgroud)

如果您使用Rails 5.1,查询将如下所示:

Comment.where(created_at: @selected_date.all_day)
Run Code Online (Sandbox Code Playgroud)

  • 辉煌。这实际上是 ActiveSupport gem(以及随后的整个 ActiveRecord 生态系统)的一部分,因此它也可以在 Rails 之外运行!只需`require 'active_record'` 就可以了! (3认同)

bou*_*uby 10

我运行此代码以查看检查的答案是否有效,并且必须尝试交换日期以使其正确.这工作 -

Day.where(:reference_date => 3.months.ago..Time.now).count
#=> 721
Run Code Online (Sandbox Code Playgroud)

如果你认为输出应该是36,那么请考虑一下,先生,3天到3个人有多少天?


小智 6

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


ben*_*ben 5

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

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

或这个:

@comments = Comment.where(:created_at => @selected_date.beginning_of_day..@selected_date.end_of_day)
Run Code Online (Sandbox Code Playgroud)


nro*_*ose 5

我一直在使用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 []> 
Run Code Online (Sandbox Code Playgroud)

而且,是的,总是很高兴使用范围!