ruby 中的日期转换问题

Issue in date conversion in ruby

在我的@query 中,我将日期设置为 MM-DD-YYYY 格式。例如,01-22-2016。现在我想从消息 table 中搜索那个日期的日期,我该怎么做。我添加了查询:

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

希望您没有将日期存储在数据库中的 VARCHAR 列中,而是 DATETIME 或等效列。不要转换为 String,让 ActiveRecord 为您处理日期:messages.created_at = ?.

来自你对@Amadan 回答的评论:

If I don't convert my message.created_at then I am getting blank result.

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