0

start私は、end日時の2つの条件を使用して単純なクエリを作成しようとしています。

開発モードでは問題はなく、うまく機能しているようです(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")

.utcPGがSQLiteとは異なる時間を読み取る場合に備えて、他の提案を試しました...しかし、問題がどこにあるのかわかりません。

ご協力ありがとうございました

オーレリアン

4

3 に答える 3

4

この問題の解決策は、その単語endPostgreSQLの予約語であるということです。あなたの答えとリンクをありがとうMicapam。

私の場合、Missionsテーブルにはとという名前の日時列がstartあり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

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 に答える