ruby中的日期转换问题

时间:2016-01-29 05:34:53

标签: ruby ruby-on-rails-3.2

在我的@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

2 个答案:

答案 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 = ?