Một số câu trả lời đã gợi ý tính toán / lưu trữ ngày trong năm và phân loại dựa trên điều đó, nhưng chỉ điều này sẽ không hiệu quả nhiều khi bạn đã gần đến cuối năm và cần phải xem xét những người có sinh nhật vào đầu năm sau.
Tôi muốn đưa ra một giải pháp trong đó bạn tính toán đầy đủ ngày (năm, tháng, ngày) của sinh nhật tiếp theo của mỗi người , sau đó sắp xếp trên đó. Bạn có thể thực hiện việc này bằng mã Ruby hoặc sử dụng một thủ tục được lưu trữ trong cơ sở dữ liệu. Sau này sẽ nhanh hơn, nhưng sẽ khiến ứng dụng của bạn khó di chuyển sang nền tảng db khác sau này.
Sẽ là hợp lý nếu chỉ cập nhật danh sách các sinh nhật sắp tới này một lần mỗi ngày, có nghĩa là bạn có thể sử dụng một số hình thức lưu vào bộ nhớ đệm. Do đó, tốc độ của truy vấn / mã cần thiết sẽ ít gặp vấn đề hơn và những thứ như thế này sẽ hoạt động tốt miễn là bạn lưu kết quả vào bộ nhớ cache:
class User
def next_birthday
year = Date.today.year
mmdd = date_of_birth.strftime('%m%d')
year += 1 if mmdd < Date.today.strftime('%m%d')
mmdd = '0301' if mmdd == '0229' && !Date.parse("#{year}0101").leap?
return Date.parse("#{year}#{mmdd}")
end
end
users = User.find(:all, :select => 'id, date_of_birth').sort_by(&:next_birthday).first(5)
Chỉnh sửa :Đã sửa để hoạt động chính xác với các năm nhuận.