我有一个导出一些列的视图,一列叫做
'created_at' type:"timestamp without timezone" format: "2014-03-20 12:46:36.590253"
在rails中我有一个方法,它从视图中获取数据并尝试按日期过滤数据。我尝试将created_at rapping到date()但仍然无效。 有什么想法吗?
return ActiveRecord::Base.connection.select_all("
select * from db_functions where date(created_at) >= #{date_p} AND date(created_at) <= #{date_p}")
PG::UndefinedFunction: ERROR: operator does not exist: date >= integer
LINE 2: ...select * from db_functions where date(created_at) >= 2014-03...
^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
答案 0 :(得分:1)
第一个值得注意的问题是你的时间没有被引用。这导致时间被视为整数。要解决此问题,您只需使用引号括起date_p
或使用ActiveReocrd::ConnectionAdapters#quote
作为:
conn = ActiveRecord::Base.connection
return conn.select_all("select * from db_functions
where date(created_at) >= #{conn.quote(date_p)}
AND date(created_at) <= #{conn.quote(date_p)}")
另一种选择,您可以将created_at
修改为当天值的开头并删除“日期”,而不是将date
中的每个where
转换为date_p
。完全转换。此外,不是直接在查询中使用值,而是最好使用prepared statements(链接文章已有几年历史,但使用示例清楚地解释了准备好的语句)。
然后还有将日期时间参数修改为开始日期的任务。鉴于date_p
是字符串而不是时间,您可以执行以下操作:
date_p = Time.zone.parse("2014-03-20 12:46:36.590253").beginning_of_day.utc
return ActiveRecord::Base.connection.select_all("select * from db_functions
where created_at >= ?
AND created_at <= ?", date_p, date_p)