【问题标题】:Syntax Error in Datetime range Query in Ruby on RailsRuby on Rails 中日期时间范围查询中的语法错误
【发布时间】:2025-12-17 10:00:01
【问题描述】:

我正在执行一个 ruby​​ 查询:

Timeslot.where("start_date >= ? AND end_date <= ?", Wed, 01 Jul 2015 18:00:00 SGT +08:00, Wed, 01 Jul 2015 21:00:00 SGT +08:00)

我收到以下错误

 SyntaxError: unexpected tCONSTANT, expecting ')'
...AND end_date <= ?", Wed, 01 Jul 2015 18:00:00 SGT +08:00, We...

我想这是因为我没有在星期三之后逃避“,”字符。我有两个问题:

1) 如何更正此查询? 2) 我将用实际的日期时间变量替换 Wed, 01 Jul 2015 18:00:00 SGT +08:00?如果日期时间是变量而不是常量,如何以正确的方式键入此查询?

【问题讨论】:

  • start_time= Time.nowend_time = Time.now + 2.hours。查询:Timeslot.where("start_date &gt;= ? AND end_date &lt;= ?", start_time, end_time)
  • Wed, 01 Jul 2015 18:00:00 SGT +08:00 既不是有效的 Ruby 日期,也不是有效的 SQL 日期。
  • @Stefan 是的。在 rails 模型的默认 created_at 字段中,这是您要找到的格式
  • 没错,它是一种格式,即字符串表示,而不是日期本身。在 IRB(或 rails 控制台)中输入 Date.today 会返回格式为 Mon, 13 Jul 2015 的日期,但输入 Mon, 13 Jul 2015 会导致语法错误。

标签: ruby-on-rails ruby postgresql datetime


【解决方案1】:

使用DATETIME ...

start_date=DateTime.parse(Wed, 01 Jul 2015 18:00:00 SGT +08:00)
end_date=DateTime.parse(Wed, 01 Jul 2015 21:00:00 SGT +08:00)
Timeslot.where("start_date >= ? AND end_date <= ?",start_date,end_date)

【讨论】:

    【解决方案2】:

    我会这样写:

    Timeslot.where(
      'start_date >= ? AND end_date <= ?', 
      Date.parse('Wed, 01 Jul 2015 18:00:00 SGT +08:00'),
      Date.parse('Wed, 01 Jul 2015 21:00:00 SGT +08:00')
    )
    

    【讨论】:

      【解决方案3】:

      您是否输入了参数 Wed, 01 Jul 2015 18:00:00 SGT +08:00 没有引号?

      我想如果你想使用那种格式。试试这个。

      "Wed, 01 Jul 2015 18:00:00 SGT +08:00".to_time()
      # to_time() method converted to Time Class (timezone is followed by rails setting)
      

      "2015-07-01 18:00:00".to_time() # works well.
      

      【讨论】:

        【解决方案4】:

        您似乎必须将字符串日期转换为正确的日期格式才能执行查询操作。就像您在 UTC 时区有日期一样,那么最好使用 Time 对象并转换为正确的日期格式并在您的查询中使用它,

        str = "Tue, 10 Aug 2010 01:20:19 +0400"
        puts Date.parse str
        2010-08-10
        
        puts Date.parse(Time.parse(str).utc.to_s)
        2010-08-09
        

        【讨论】: