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

Ruby on Rails:如何结合日期时间字段查询两小时前预订数据

查询两小时前的预订数据(基于Active Support)

你的原代码Booking.where([booking_time], 2.hours.ago.to_datetime)存在几个问题:无对应booking_time字段、未处理日期与时间字段的合并逻辑、where语法错误。以下是正确的实现方案:

由于数据表将日期和时间拆分为booking_date(日期类型)和booking_time_from(时间类型)两个字段,需要先将二者合并为完整的datetime值,再与两小时前的时间做比较。

按数据库类型选择查询语句

PostgreSQL

# 合并日期+时间,筛选出开始时间早于两小时前的记录
Booking.where("(booking_date + booking_time_from) < ?", 2.hours.ago)

MySQL

# 用TIMESTAMP函数合并日期和时间字段
Booking.where("TIMESTAMP(booking_date, booking_time_from) < ?", 2.hours.ago)

封装为模型Scope(通用写法)

可以在Booking模型里定义可复用的查询范围,自动适配数据库类型:

class Booking < ApplicationRecord
  scope :started_before_two_hours_ago, -> {
    adapter = ActiveRecord::Base.connection.adapter_name.downcase
    case adapter
    when 'postgresql'
      where("(booking_date + booking_time_from) < ?", 2.hours.ago)
    when 'mysql2'
      where("TIMESTAMP(booking_date, booking_time_from) < ?", 2.hours.ago)
    end
  }
end

调用时直接用Booking.started_before_two_hours_ago即可获取目标数据。

关键说明

  • 2.hours.ago是Active Support提供的便捷方法,会自动生成当前时间往前推两小时的Time对象,Rails会自动转换为数据库兼容的格式,无需手动调用to_datetime
  • 若需求是筛选结束时间在两小时前的记录,只需将上述代码中的booking_time_from替换为booking_time_to
  • 确保booking_date为Date类型,booking_time_from/booking_time_to为Time类型或可被数据库解析的字符串类型

内容的提问来源于stack exchange,提问作者Ryan Tran

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 14:00:51