0

这是设置:

end_date = DateTime.parse('2010-01-01 12:00:00-04')

有时它被初始化:

end_date = 1.days.ago

问题......这些named_scope(s)是否生成相同的EXACT SQL

named_scope :before, lambda { |end_date| 
     { :conditions => 
            ["overdraft_transaction_payments.created_at < ?", end_date] } 
}

named_scope :before, lambda { |end_date| 
     { :conditions => 
            ["overdraft_transaction_payments.created_at < ?", end_date.utc] } 
}

在第一个示例中,我使用 end_date,在第二个示例中,我使用 end_date.utc。

(可能需要注意...... DB服务器的操作系统设置为CDT,而DB内部使用UTC。rails服务器的操作系统设置为CDT,应用程序实例设置为EDT。我意识到这可能是不是配置这些系统的最佳方式,但是,当前的问题是 ActiveRecord 输出。)

值得我的直觉是,第一个示例将为本地 TZ 生成一个时间字符串,而第二个示例将生成一个 UTC-0。

PS:有没有可以用来验证我的直觉的小测试用例?

4

1 回答 1

1

我相信在后台,日期将通过调用“.to_s(:db)”进行转换,您可以在 IRB 控制台会话中看到将返回的内容:

>> DateTime.parse('2010-01-01 12:00:00-04').to_s(:db)
=> "2010-01-01 12:00:00"
>> DateTime.parse('2010-01-01 12:00:00-04').utc.to_s(:db)
=> "2010-01-01 16:00:00"
>> 1.days.ago.to_s(:db)
=> "2010-08-12 18:01:09"
>> 1.days.ago.utc.to_s(:db)
=> "2010-08-12 18:01:13"
于 2010-08-13T18:03:08.720 回答