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

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、周一为1
    Appointment.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、周一为1
    Appointment.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 22:39:05