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

datetime, range, ruby-on-rails

Solution

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

Problem

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.

Original source