如何在PGSQL中按日期搜索



我得到这个错误:

ActionView::Template::Error (PGError: Error: operator does not exist: timestamp without time zone ~~ unknown LINE 1:…"articles"(文章)。"created_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上,但它不允许我这样做。解决方案是什么?谢谢你!

在postgres中,时间戳不是像sqlite那样以字符串的形式存储的:

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)

虽然我喜欢@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

相关内容

  • 没有找到相关文章

最新更新