Answers:
请注意,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)
1..1000000000000
我不清楚您是“ 单独使用范围”的意思
scope :between, -> (a, b) { where(created_at: a..b) }
我将亲自创建一个范围,使其更具可读性和可重用性:
在Comment.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)
希望能帮助到你。
#between?
接受了范围。
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)
require 'active_record'
,您已经准备就绪!
此代码应为您工作:
Comment.find(:all, :conditions => {:created_at => @selected_date.beginning_of_day..@selected_date.end_of_day})
有关更多信息,请查看时间计算
注意:不建议使用此代码。如果您使用的是Rails 3.1 / 3.2,请使用答案中的代码
date()
函数;它可能更独立于数据库。
我一直在使用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
}