Дата заказа на день и месяц - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть пользователи с birth_date, и теперь я хочу опросить всех пользователей, у которых есть день рождения, в течение следующих 10 дней.Я не могу просто заказать на birth_date, потому что тогда я получу это:

01-01-1960
18-12-1975
16-12-1998

Вместо желаемого результата:

16-12-1998
18-12-1975
01-01-1960

Так как я могу заказать только в деньи месяц, а не год?

Ответы [ 3 ]

0 голосов
/ 14 декабря 2018

На стороне Ruby вы можете сначала выбрать нужных пользователей (используется Postgresql to_char):

today = Date.current
dates = (today ... today + 10.days).map { |d| d.strftime('%m%d') }
dates << '0229' if dates.include?('0228') # update by SteveTurczyn
users = User.where("to_char(birth_date, 'MMDD') in (?)", dates).to_a

, а затем отсортировать их:

users.sort_by! do |user|
  user_yday = user.birth_date.yday
  user_yday >= today.yday ? user_yday : user_yday + 366
end
0 голосов
/ 14 декабря 2018

Рубиновая реализация.Обратите внимание, что она может быть не такой производительной, как версия БД ...

ids_of_next_10_days = User.all.pluck(:id, :birth_date).map do |user_info|
  next_birthday = user_info[1].change(year: Time.now.year) 
  next_birthday = next_birthday.change(year: Time.now.year + 1) if next_birthday < Date.today
  next_birthday.between?(Date.today, Date.today + 10) ? user_info[0] : nil
end.compact

User.where(id: ids_of_next_10_days)
0 голосов
/ 14 декабря 2018

Это работает в postgreSQL ...

start_month = Date.today.month
start_day = Date.today.day
end_month = (Date.today + 10).month
end_day = (Date.today + 10).day

if start_month == end_month
    @users = User.where("DATE_PART('month', birth_date) = ? AND DATE_PART('day', birth_date) >= ? AND DATE_PART('day', birth_date) <= ?", start_month, start_day, end_day)
else
    @users = User.where("(DATE_PART('month', birth_date) = ? AND DATE_PART('day', birth_date) >= ?) OR (DATE_PART('month', birth_date) = ? AND DATE_PART('day', birth_date) <= ?)", start_month, start_day, end_month, end_day)
end
@users.order("DATE_PART('month', birth_date), DATE_PART('day', birth_date)")

Выбирает все записи с днями рождения в течение следующих 10 дней и сортирует их.

Если десять дней в будущем все те жемесяц (скажем, 14 декабря) выбирает декабрь между 14 и 24 ... если он в будущем месяце (скажем, 25 декабря), он выбирает декабрь до конца месяца и январь с начала до 4 числа.

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