我们有一个非常简单的付款模型,带有默认的“ created_at”日期时间字段,我们必须在日期范围内进行搜索,所以我这样做:
>> Payment.all(:conditions => ["Date(payments.created_at) >= ? and Date(payments.created_at) <= ?", start_date, end_date])
我在使用Date函数时遇到问题。例如
>> Payment.find(2577).created_at => Thu, 15 Dec 2011 18:15:00 UTC +00:00
但
>> Payment.find(2577).created_at.localtime => Fri Dec 16 01:15:00 +0700 2011
因此,当我们在12月16日搜索付款时,由于Date(payments.created_at)将UTC时间转换为日期,而转换为12月15日,因此没有任何结果。
是否可以修改Date(payments.created_at),以便改为搜索本地时区的日期?我们正在使用Rails 2.3.5和postgresql。
终于让它工作了!不是很漂亮(我希望有一个更干净的解决方案),但是这样做有效:
>> Payment.all(:conditions => ["Date((payments.created_at at time zone 'UTC') at time zone :timezone) >= :start_date and Date((payments.created_at at time zone 'UTC') at time zone :timezone) <= :end_date", :start_date => start_date, :end_date => end_date, :timezone => 'Asia/Katmandu'])
不过,我并不真正喜欢这样做:
Date((payments.created_at at time zone 'UTC') at time zone 'Asia/Katmandu')
为何postgresql不允许您这样做?
Date(payments.created_at at 'Asia/Katmandu')