Как сравнить даты в рельсах без года? - PullRequest
4 голосов
/ 10 сентября 2011

Я пытаюсь найти всех пользователей с днями рождения в ближайшие 2 недели.

Я попробовал следующее:

User.find(:all, :conditions => ["DOB > ? and DOB <= ?", Date.today, 2.weeks.from_now])

, что явно не работает, потому что «год» в DOB не равен этому году.

Мне нужно только сравнить месяцы и дни.

Как я могу это сделать?

Ответы [ 4 ]

1 голос
/ 10 сентября 2011

Вы должны выполнить метод mysql для вашего столбца dob

Что-то вроде следующего

  SELECT FROM users  
         WHERE DAYOFYEAR(dob)in (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14)

Вы можете использовать такие функции, как WEEK, в зависимости от того, что вам подходит. Ref this для функции mysql

В рубине

arr=[]
(0..13).each{|i| arr << (Date.today+i.day).day }
User.find(:all, :conditions => ["DAYOFYEAR(DOB) in (?)", arr])
1 голос
/ 10 сентября 2011

Основываясь на ответе Салила, я получил следующее, чтобы он работал для sqlite:

arr = []
(0..14).each { |i| arr << (Date.today + i.day).yday }
@users = User.find(:all, :conditions => ["cast(strftime('%j', DOB) AS int) in (?)", arr])
0 голосов
/ 23 апреля 2018

Еще один подход к postgresql:

scope :with_bday, -> (from, to) {
    where("EXTRACT(DOY FROM birthday)::int BETWEEN ? AND ?", *[
        from.yday,
        to.yday
    ])
}
0 голосов
/ 10 сентября 2011

Это может помочь в изменении формата даты для сравнения, так как по умолчанию это займет Date.today.year.

              Date.strptime("{ #{DOB.month}, #{DOB.date} }", "{ %m, %d }").

Date.strptime ("{9, 10}", "{% m,% d}") дает

<Date: 2011-09-10 (4911629/2,0,2299161)>

Публикуйте, если у вас есть код для прямого сравнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...