Michael
Michael

Reputation: 1042

Ruby on Rails query by datetime range ( last 24, 48, etc... hours )

I'm trying to build a query that will search for recent entries based on column 'last_login_at'. This is a datetime field with time zone (i.e. Time.zone.now) When I execute

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

I get nothing.

Alternatively I can define today as Time.zone.today and yesterday as Time.zone.today - 1.day and run

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

and it still returns 0 results. I know there are some entries that fall into this category.

Upvotes: 5

Views: 12679

Answers (2)

AJcodez
AJcodez

Reputation: 34236

Old question, but here's newer syntax:

User.where(last_login_at: 3.days.ago..DateTime.now)

Upvotes: 20

Roja Buck
Roja Buck

Reputation: 2354

Ensure that the timezones you have recorded within the database and those your rails app is outputting are equal. This can sometimes cause an issue. Otherwise try this named scope:

 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

allowing you to do:

 User.last_loggedin_before 24.hours.ago

or

 User.last_loggedin_within 24.hours.ago

Upvotes: 12

Related Questions