ruby中的日期转换问题

ruby中的日期转换问题,ruby,ruby-on-rails-3.2,Ruby,Ruby On Rails 3.2,在我的@query中,我将日期设置为MM-DD-YYYY格式。e、 g.,2016年1月22日。现在我想从messages表中搜索带有该日期的日期我该怎么做。我添加了一个问题: Message.includes(:user) .select('messages.*, users.name') .where( "users.name ilike ? OR messages.to ilike ? OR messages.created_at.srtftime(\"%Y-%m-%d\"

在我的@query中,我将日期设置为MM-DD-YYYY格式。e、 g.,2016年1月22日。现在我想从messages表中搜索带有该日期的日期我该怎么做。我添加了一个问题:

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

但是错误是:
未知类型的%string

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

来自您对@Amadan答案的评论:

如果我不转换在处创建的
消息,则得到的结果为空

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
是一个时间戳,除非记录恰好是在午夜创建的,否则相等性比较将失败

您需要做的是将在
创建的
消息的日期部分与查询的日期进行比较。要在PostgreSQL中获取时间戳的日期部分,可以使用
date()
函数或
::date
后缀:

Message.includes(:user)
  .select('messages.*, users.name')
  .where(
    "messages.created_at::date = ?",
    Date.strptime(@query, "%m-%d-%Y")
)

实际上,我在顶部有一个搜索文本字段,用户可以在其中按姓名、电子邮件或日期进行搜索。对于日期,我们已将格式指定为:MM-DD-YYYY。因此结果是字符串形式的。在我创建的数据库中,_at以以下格式存储:2015-10-07 12:43:35.273415,仅说明输出是什么样的。您的数据库模式中有什么?您的
创建表
是什么样子的?如果用户输入的日期是
字符串
,请在控制器的操作中将其转换为
日期时间
,您的模型将永远不会在那里看到
字符串
。created_at的数据类型为时间戳,不带时区。我已使用:Date.strtime(@query,%m-%d-%Y)转换了@query。我还想将message.created_at转换为相同的格式,然后进行比较。但是我得到了同样的错误,我要说的是,您不需要转换
message.created\u at
。它是一个时间戳;您的DBMS足够智能,可以比较两个时间戳。如果您的
@query
是一个
日期
日期时间
或类似的查询,那么ActiveRecord非常聪明,可以将其格式化为DBMS可以将其理解为时间戳。