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