Query for a specific day and month of a date

Hi all!

I have a table with the birthdays of users and I want my app to list all users who birthdays today.

If today is 21/09/2009, I need all the rows which have the field b_date 21/09.

How can I get that condition in ActiveRecord? Should I try something like this:

@birthdays = Birthday.find(:all, :conditions => {:b_date.day => Date.today.day, :b_date.month => Date.today.month})

I'm a newbie so excuse me if this question is to much easy and excuse my poor english too...

Thanks in advance.

Hi all!

I have a table with the birthdays of users and I want my app to list all users who birthdays today.

If today is 21/09/2009, I need all the rows which have the field b_date 21/09.

How can I get that condition in ActiveRecord? Should I try something like this:

@birthdays = Birthday.find(:all, :conditions => {:b_date.day => Date.today.day, :b_date.month => Date.today.month})

I'm a newbie so excuse me if this question is to much easy and excuse my poor english too...

You can't do it quite like that. You need to turn what you want into
something of the form

start_time <= b_date and b_date < end_time

(so start_date is probably the first second of today and end_time is
the first second of tomorrow)

You can't use the hash form of conditions for this.

Fred

Thanks!

I did it that way Aldric. It seems to be the better way. I will have a lots of rows in the database, so I wanted to boost the performance. That's why I want only to retrieve the specific day.

Thanks again! :smiley:

It's not a good idea to store dates in the DB as strings. You should store dates as dates in the DB. SQL has date handling functions that you can use,

I agree with Marnen in this point. If you use a table "birthdays" for storing the birthdays for users having fields       user_id => :integer       date => :date

then i think its better to use named_scope. As i said, if your model name is Birthday then define a named_scope as       named_scope :of_day, lambda { |date| {:conditions => { :day => date } } }

And call it like       Birthday.of_day(Date.today)

That will generate a single query like following       SELECT * FROM `birthdays ` WHERE (`birthdays `.`date` = '2009-09-22')

This will give you a reusable and readable way you can apply for any other days if you want. Hope this will help :smiley:

Thank you.

samiron