0

我一直在尝试用两个条件startend日期时间进行简单的查询。

在开发模式下我没有任何问题,它似乎运行良好(SQLite)

但是在生产模式下我有以下错误:

 ActionView::Template::Error (PG::Error: ERROR:  syntax error at or near "end"
 LINE 1: ...ions"  WHERE (start >= '2013-01-30T10:12:24Z' AND end >= '20...
: SELECT COUNT(*) FROM "missions"  WHERE (start >= '2013-01-30T10:12:24Z' AND end >= '2013-01-30T10:12:24Z')):
                                                              ^
     6:                 <li class="mission clearfix">
     1: <h4 class="heading-sep"><%= t(".upcoming_missions")%></h4>
     2: <div class="missions-timeline">
     3:     <ul class="mission-list">
   app/views/users/show.html.erb:12:in `_app_views_users_show_html_erb___1717297229253226868_63256380'
     7:                     <div class="mission-wrap clearfix">
     4:         <% if @upcoming_missions.any? %>

     5:             <% @upcoming_missions.each do |mission| %>
   app/views/users/_mission_timeline.html.erb:4:in `_app_views_users__mission_timeline_html_erb__2786253018340202740_62779040'

在我的控制器中,我有以下查询:

@upcoming_missions = Mission.where("start >= ? AND end >= ?", Time.now, Time.now).order("created_at DESC")

@current_missions = Mission.where("start <= ? AND end >= ?", Time.now, Time.now).order("created_at DESC")

@past_missions = Mission.where("start <= ? AND end <= ?", Time.now, Time.now).order("created_at DESC")

我尝试了其他建议,包括.utc以防 PG 读取时间与 SQLite 不同......但我不确定问题出在哪里。

谢谢您的帮助

奥雷连

4

3 回答 3

4

该问题的解决方案是该词endPostgreSQL 的保留关键字。感谢 Micapam 的回答和链接。

就我而言,我的 Missions 表有名为startand的日期时间列end。在开发模式下使用 SQLite 运行时,它没有返回任何错误,并且以正确的方式对我的任务进行排序。奇怪的是,end它也是SQLite 中的保留关键字,但仍然让我运行我的查询。

为了解决这个问题,我只是在迁移中重命名了我的列

class ChangeStartAndEndFromMission < ActiveRecord::Migration
  def change
    change_table :missions do |t|
      t.rename :start, :start_time
      t.rename :end, :end_time
    end
  end
end

最好检查这些保留关键字以确保没有冲突。

于 2013-01-31T23:26:12.393 回答
2

我没有足够的代表来添加到 Aurelien 的答案中,但我只是想说你也可以table_name.end在你的情况下使用,而不仅仅是end.

于 2014-10-21T05:42:34.483 回答
0

我认为这可能是恼人的 Postgres 的日期和时间之间的“T”。尝试使用 strftime 查找 Postgres 喜欢的格式 - 例如:

Time.now.strftime('%F %T')

这会给你一个日期/时间字符串,比如2013-01-30 21:58:07.

于 2013-01-30T11:00:00.300 回答