订单日期的日期和月份

时间:2018-12-14 08:06:17

标签: ruby-on-rails

我有一个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 :(得分:1)

这在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天内所有带有生日的记录并对其进行排序。

如果将来的十天仍然是同一个月(例如12月14日),则选择14到24之间的12月...如果是将来的月份(例如12月25日),则选择12月到月底一月开始到四月。

答案 1 :(得分:1)

红宝石实现。请注意,它的性能可能不如数据库版本...

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)

答案 2 :(得分:0)

在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