比较db的日期

时间:2014-03-26 14:26:34

标签: ruby-on-rails activerecord postgresql-9.3

我有一个导出一些列的视图,一列叫做

'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.

1 个答案:

答案 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)