Rails中如何仅使用Date.today的月日查询近期及即将到来的周年纪念?
解决周年纪念按月日查询的问题
直接忽略年份,只通过月日匹配目标区间的查询方法如下:
首先计算目标日期范围(今天前后7天)的月日字符串:
start_date = Date.today - 7 end_date = Date.today + 7 start_mmdd = start_date.strftime('%m%d') end_mmdd = end_date.strftime('%m%d')
针对PostgreSQL数据库
根据日期范围是否跨年,分两种情况查询:
if start_mmdd <= end_mmdd ann = Anniversary.where("to_char(anniversary, 'MMDD') BETWEEN ? AND ?", start_mmdd, end_mmdd) else # 跨年度情况,比如12月30日到次年1月5日 ann = Anniversary.where("to_char(anniversary, 'MMDD') >= ? OR to_char(anniversary, 'MMDD') <= ?", start_mmdd, end_mmdd) end
针对MySQL数据库
替换日期格式化函数即可:
if start_mmdd <= end_mmdd ann = Anniversary.where("DATE_FORMAT(anniversary, '%m%d') BETWEEN ? AND ?", start_mmdd, end_mmdd) else ann = Anniversary.where("DATE_FORMAT(anniversary, '%m%d') >= ? OR DATE_FORMAT(anniversary, '%m%d') <= ?", start_mmdd, end_mmdd) end
性能优化建议
如果数据量较大,建议给月日表达式建立函数索引,避免全表扫描:
- PostgreSQL:
CREATE INDEX idx_anniversaries_mmdd ON anniversaries (to_char(anniversary, 'MMDD'));
- MySQL:
CREATE INDEX idx_anniversaries_mmdd ON anniversaries (DATE_FORMAT(anniversary, '%m%d'));
内容的提问来源于stack exchange,提问作者Tom Connolly
相关产品推荐
相关产品推荐

