You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 10:10:26