ruby中的日期转换问题
在我的@query中,我将日期设置为MM-DD-YYYY格式。e、 g.,2016年1月22日。现在我想从messages表中搜索带有该日期的日期我该怎么做。我添加了一个问题: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\"
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可以将其理解为时间戳。