在我的@query中,我将日期设置为MM-DD-YYYY格式。例如,01-22-2016。现在我想用消息表中的日期搜索日期,我该怎么办。我添加了查询:
Message.includes(:user)
.select('messages.*, users.name')
.where(
"users.name ilike ? OR messages.to ilike ? OR messages.created_at.srtftime(\"%Y-%m-%d\") = ?",
"%#{@query}%",
"%#{@query}%",
Date.strptime(@query, "%m-%d-%Y")
)
但我正在解决这个问题:
ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR: column "%Y-%m-%d" does not exist
我还将查询添加为:
Message.includes(:user)
.select('messages.*, users.name')
.where(
"users.name ilike ? OR messages.to ilike ? OR messages.created_at.srtftime("%Y-%m-%d") = ?",
"%#{@query}%",
"%#{@query}%",
Date.strptime(@query, "%m-%d-%Y")
)
但是错误就是:unknown type of %string
答案 0 :(得分:2)
根据您对@Amadan的回答的评论:
如果我没有转换我的
message.created_at
,那么我的结果就是空白。Message.includes(:user) .select('messages.*, users.name') .where( "users.name ilike ? OR messages.to ilike ? OR messages.created_at = ?", "%#{@query}%", "%#{@query}%", Date.strptime(@query, "%m-%d-%Y") )
这将生成一个查询,其中包括(以及其他)这样的条件:
messages.created_at = '2016-01-29 00:00:00'
很明显为什么这不起作用。
messages.created_at
是一个时间戳,除非恰好在午夜创建了记录,否则相等比较将失败。
您需要做的是将messages.created_at
的日期部分与查询中的日期进行比较。要在PostgreSQL中获取时间戳的日期部分,您可以使用date()
函数或::date
后缀:
Message.includes(:user)
.select('messages.*, users.name')
.where(
"messages.created_at::date = ?",
Date.strptime(@query, "%m-%d-%Y")
)
答案 1 :(得分:0)
希望您在VARCHAR
列中没有存储在数据库中的日期,但是DATETIME
或等效日期。请勿转换为String
,让ActiveRecord为您处理日期:messages.created_at = ?
。