小编典典

如何在查询期间将时间转换为本地时区中的日期

sql

我们有一个非常简单的付款模型,带有默认的“ 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。


阅读 175

收藏
2021-05-16

共1个答案

小编典典

终于让它工作了!不是很漂亮(我希望有一个更干净的解决方案),但是这样做有效:

>> 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')
2021-05-16