如何在PGSQL中按日期搜索?

时间:2011-04-04 16:20:42

标签: ruby-on-rails-3 postgresql heroku

我收到此错误:

ActionView :: Template :: Error(PGError:错误:运算符不存在:没有时区的时间戳~~未知的第1行:......“文章”WHERE(“articles”。“created_at”LIKE'2010 ..

我有一个存档控制器,我可以按流派和年,月,日动态显示文章,网址中有这些字段。在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

将使用metawhere查找与我提供的字符串部分匹配的日期。这在Sqlite中完美运行。我已将我的应用程序迁移到heroku和PGSQL,但它不允许我这样做。解决办法是什么?谢谢!

2 个答案:

答案 0 :(得分:1)

在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)

答案 1 :(得分:0)

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