Rails 3 DateTime Comparison w/ Date In An ActiveRecord Query

12,014

Solution 1

Try created_at >= some_day_with_00:00:00 timestamp and create_at < some_day_plus_one_with_00:00:00 timestamp

Solution 2

I would do something like...

someday = Date.today
Foo.where( :created_at => (someday)..(someday + 1.day) )

This would capture all created_at dates between midnight on someday and someday + 1. This is inclusive (so it would include a Foo created bang on midnight on the +1 day) but may be 'just good enough' for your needs without messing with timestamps.

For niceness, I would wrap it up as a scope

scope :on_day, ( lambda do |someday|
  where( :created_at => (someday)..(someday + 1.day) )
end )

So

Foo.on_day( Date.yesterday ).count

is nicely readable.

Solution 3

DateTime class have two usefull methods to do this: beginning_of_day and end_of_day.

For this case, in which you have a Date object, you might do:

Foo.where('created_at >= #{Date.today.to_time.beginning_of_day} AND 
           created_at <= #{Date.today.to_time.end_of_day}')

Notice that you have to transform the Date object to a DateTime object

Share:
12,014
Noz
Author by

Noz

Lorem ipsum dolor sit amet, consectetur adipiscing elit. In cursus libero est, ac vulputate neque convallis at. Praesent lacinia purus at arcu vestibulum pulvinar. Praesent porta nisl sit amet nulla consectetur blandit. Integer sit amet mauris quis lacus auctor rutrum lobortis sit amet risus. Mauris nibh tellus, rhoncus non consectetur mollis, dapibus rutrum libero. Nulla sed nisl vel ipsum tincidunt porttitor. Sed arcu libero, elementum sed purus in, varius viverra erat. Fusce mi velit, mollis nec dapibus et, consequat nec neque. Vestibulum vel sodales tellus. Ut vel arcu purus. Phasellus tempus enim justo, sit amet mattis augue lobortis nec. Donec pretium dolor id magna sollicitudin aliquam. Nunc magna augue, mattis vitae dolor id, pharetra ultrices quam. Quisque turpis nunc, mollis id elit id, rhoncus vehicula eros. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aenean accumsan neque a fermentum consequat. Maecenas blandit adipiscing ipsum, eget tincidunt tortor porta at. Sed nec est commodo, sollicitudin libero vel, fermentum ipsum. Nulla nec dolor a ligula viverra gravida eget eu leo. Curabitur aliquam, odio vitae eleifend dignissim, purus tellus consectetur augue, eu placerat quam turpis in lacus. In volutpat consectetur nisl, non molestie neque pharetra et. Nullam non turpis quis arcu rutrum pharetra non viverra eros. Maecenas blandit tristique quam nec ultricies. Proin sit amet congue risus. Vestibulum quis vulputate odio. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis eg

Updated on July 27, 2022

Comments

  • Noz
    Noz almost 2 years

    I'm trying to search a model for any dates equal to a specific date while omitting the timestamp. In Rails I could simply execute this as DateTime.to_date == somedate, however I don't think it's quite as easy to formulate in SQL where I wouldn't be able to apply the to_date method to an entire column like created_at:

    Foo.where("created_at == some_day_without_time_stamp").count
    

    Initially I thought that because I was using a postgresql database I could simply use psql syntax, but I much much rather leave it to ActiveRecord to decide what sql is most applicable and keep my code agnostic of database vendors. Is this possible without any additional plugins or gems?

  • Kasper Grubbe
    Kasper Grubbe over 10 years
    You have an off by one, which could lead to you counting a day twice. This was my fix: where( :created_at => (someday)..(someday + 23.hours + 59.minutes + 59.seconds) )