我收到此错误:
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,但它不允许我这样做。解决办法是什么?谢谢!
答案 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