我有一个rails应用程序,我将created_at存储为datetime(标准).我正在构建一个搜索表单,我发现我必须使用find_by_sql来执行一些复杂的子查询.表单有一个日期范围(没有时间)来搜索items_at字段的项目.
我发现的问题是,如果我只传入范围的日期字符串来查询...
... status_changes.created_at between '2009-01-24' and '2009-03-12' ...
我收回了创建日期为2009-01-23 17:10:39 -0800的记录,因为它存储在数据库中,如2009-01-24 01:10:39(UTC)
我如何解决这个问题,以便结果不会返回有问题的记录?
我似乎需要将日期范围转换为UTC特定的,或者告诉find_by_sql根据当前时区进行搜索,而不是将列读取为utc ...
任何接受者?
约翰
现代ActiveRecord的做法是:
Model.where(time_field: date1..date2)
如果你不使用find_by_sql
,而是使用find
带有:conditions
让Rails做替换的子句,它将自动转换所有内容.
Model.find :all, :conditions => ["created_at between ? and ?", start_date, end_date]
最糟糕的情况是,如果Rails被日期混淆,你可以将它们转换为时间,它应该很好地运行:
Model.find :all, :conditions => ["created_at between ? and ?", start_date.to_time, end_date.to_time]