Ruby on Rails按日期时间范围查询(最后24,48等...小时)

Mic*_*ael 5 datetime ruby-on-rails range

我正在尝试构建一个查询,该查询将根据列'last_login_at'搜索最近的条目.这是一个带时区的日期时间字段(即Time.zone.now)执行时

User.find(:all, :conditions => ["last_login_at < ?", 24.hours.ago])
Run Code Online (Sandbox Code Playgroud)

我一无所获.

或者,我可以将今天定义为Time.zone.today昨天Time.zone.today - 1.day 和运行

User.find(:all, :conditions => ["last_login_at between ? and ?", today, yesterday])
Run Code Online (Sandbox Code Playgroud)

它仍然返回0结果.我知道有些条目属于这一类.

AJc*_*dez 19

老问题,但这里有更新的语法:

User.where(last_login_at: 3.days.ago..DateTime.now)
Run Code Online (Sandbox Code Playgroud)


Roj*_*uck 11

确保您在数据库中记录的时区和您的rails应用程序输出的时区是相同的.这有时会导致问题.否则尝试这个命名范围:

 class User < ActiveRecord::Base
   named_scope :last_loggedin_before, lambda { |time_ago| { :conditions => ['last_login_at   < ?', time_ago] } }
   named_scope :last_loggedin_within, lambda { |time_ago| { :conditions => ['last_login_at   > ?', time_ago] } }
 end
Run Code Online (Sandbox Code Playgroud)

允许你这样做:

 User.last_loggedin_before 24.hours.ago
Run Code Online (Sandbox Code Playgroud)

要么

 User.last_loggedin_within 24.hours.ago
Run Code Online (Sandbox Code Playgroud)

  • 这很有效,谢谢.一个注意事项--name_scope已经改为'范围'(我在Rails 3.2.11上). (2认同)