用铁轨和时区查询postgres

时间:2014-05-22 02:42:38

标签: ruby-on-rails postgresql timezone

我正在查询这样的结果:

@logs.where("extract(dow from created_at at time zone ?) = ?", "America/New_York", day_of_week)

但它没有用。 (我还尝试了#34; Time.zone.tzinfo.identifier"在那里,但是在这里使用了测试和清晰度的结果。)例如,某人可能会在东部时间10:30发帖但由于它以UTC格式存储,因此无法显示在包含它的查询中。

我开始提出一个新问题,因为我从这里得到了这个答案,即使它有一个公认的答案,它显然对我不起作用: handling rails + postgres and timezones

这种方法有什么问题吗?还有另一种当前或更好的方式吗?

更新信息:

created_at存储为日期时间。我的时区设置仍然是UTC,但我尝试使用" America / New_York" 获取帖子。区域,应该仍然有效。由于不起作用,我的意思是我将查询第15个并且一些帖子将返回,但是由于UTC差异,在15日当天晚些时候发布的一些帖子仍将在16日返回。包含它的查询是代码块上方的列表。我试图在时区" America / New_York"中从created_at获取dow。

2 个答案:

答案 0 :(得分:3)

@logs = @logs.where("extract(day from (created_at at time zone 'Etc/UTC') at time zone ?) = ?", Time.zone.tzinfo.identifier, params[:date].to_f)

终于想通了!主要来自这个链接,但有一些小调整:

PostgreSQL: selecting rows that occur on a certain day of the week, in a specific time zone

答案 1 :(得分:1)

这是我写的关于rails和时区的博客文章,您可能会发现它有用吗? http://jessehouse.com/blog/2013/11/15/working-with-timezones-and-ruby-on-rails/

尝试像这样运行您的查询

Time.use_zone("Eastern Time (US & Canada)") do 
  start_at = (Date.current - 1.day).beginning_of_day
  end_at = start_at.end_of_day
  @logs_from_yesterday = Log.where("created_at BETWEEN ? AND ?", start_at, end_at)
end

Rails会自动将日期时间过滤器偏移到use_zone块中指定的时区,Date.current是时区感知的(Time.zone.now.to_date的别名)