我有一个birth_date
用户,现在我想查询所有未来10天内生日的用户。我不能只订购birth_date
,因为这样我会得到:
01-01-1960
18-12-1975
16-12-1998
不是期望的结果:
16-12-1998
18-12-1975
01-01-1960
那我怎么只订购日期和月份,而不订购年份?
答案 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