Rails 6如何编写where查询筛选日期字段为周一的所有记录
Rails 6 查询日期属性为周一的记录实现方法
你预想的两种写法都无法正常运行:
Appointment.where(date: monday?)中monday?是Ruby Date类的实例方法,无法直接作为查询参数传递给where,数据库无法识别该方法Appointment.where('date.wday': 1)会把date.wday识别为数据库字段名,你的表中不存在该字段,会直接报错
方案1:按数据库类型使用原生SQL函数(适合查询所有历史周一的记录)
不同数据库获取周几的内置函数存在差异,对应写法如下:
- PostgreSQL:
EXTRACT(DOW FROM 日期字段)返回值中周日为0、周一为1Appointment.where("EXTRACT(DOW FROM date) = ?", 1) - MySQL:
- 用
WEEKDAY(日期字段):周一返回0,写法为Appointment.where("WEEKDAY(date) = ?", 0) - 用
DAYOFWEEK(日期字段):周日返回1、周一返回2,写法为Appointment.where("DAYOFWEEK(date) = ?", 2)
- 用
- SQLite:
strftime('%w', 日期字段)返回值中周日为0、周一为1Appointment.where("strftime('%w', date) = ?", '1')
方案2:非数据库依赖写法(推荐,适合查询单个/指定周一的记录)
如果你的需求是查询某一个特定周一的所有记录,不需要筛选所有历史周一,直接用Ruby的日期方法算出目标周一的时间范围即可,这种写法可以命中date字段的索引,性能更高:
# 示例:查询本周一的所有预约记录 target_monday = Date.today.beginning_of_week Appointment.where(date: target_monday.all_day)
内容的提问来源于stack exchange,提问作者Ruff9
相关产品推荐
相关产品推荐

