Как мне искать по дате в PGSQL? - PullRequest
0 голосов
/ 04 апреля 2011

Я получаю эту ошибку:

ActionView :: Template :: Error (PGError: ОШИБКА: оператор не существует: отметка времени без часового пояса ~~ неизвестно LINE 1: ... "article" WHERE ("article". "Creation_at" LIKE '2010 .. .

У меня есть контроллер архива, где я могу динамически отображать статьи по жанрам и годам, месяцам и дням, причем все эти поля доступны в URL. В mysqlite у меня было это действие индекса:

def index
  filter_title
  @articles = Article.where(:created_at.matches % date_builder, :genre.matches % genre_builder).order("created_at DESC")
  respond_to do |format|
    format.json { render :json => @articles }
    format.xml  { render :xml => @articles }
    format.html
  end
end

И эта функция date_builder

def date_builder
  @date = ""
  @date += params[:year] if !(params[:year].nil?)
  @date += "-" + params[:month] if !(params[:month].nil?)
  @date += "-" + params[:day] if !(params[:day].nil?)
  @date += "%"
  @date
end

, который использовал бы метаданные, чтобы найти даты, которые соответствуют части строки, которую я предоставил. Это отлично работает в Sqlite. Я перенес свое приложение на heroku и PGSQL, и это не позволяет мне это делать. Каково решение? Спасибо!

Ответы [ 2 ]

1 голос
/ 04 апреля 2011

В postgres отметка времени не сохраняется в виде строки, как в sqllite:

select 'A' where localtimestamp like '2011-04-04%';
ERROR:  operator does not exist: timestamp without time zone ~~ unknown

как насчет использования >= вместо?

select 'A' where localtimestamp >= '2011-04-04';

 ?column?
----------
 A
(1 row)
0 голосов
/ 04 апреля 2011

В то время как мне понравился ответ @JackPDouglas, я хотел постараться сохранить как можно больше кода sql в своем проекте, поэтому я в итоге сделал следующее:

...
date_builder
  if !(params[:year].nil?)
    @articles = Article.where(
      {:created_at.gt => @datelower} &
      {:created_at.lt => (@datehigher - 1.second)} &
      :genre.matches % genre_builder
      ).order("created_at DESC")
  else
...

и этот метод для даты:

def date_builder
  if !(params[:day].nil?)
    @datelower = Time.utc(params[:year], params[:month], params[:day])
    @datehigher = @datelower + 1.day
  elsif !(params[:month].nil?)
    @datelower = Time.utc(params[:year], params[:month], 01)
    @datehigher = @datelower + 1.month
  elsif !(params[:year].nil?)
    @datelower = Time.utc(params[:year], 01, 01)
    @datehigher = @datelower + 1.year
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...