按日期获取和计算记录

时间:2013-09-27 14:23:02

标签: postgresql datetime activerecord ruby-on-rails-4 squeel

我必须进行查询以获取,然后使用created_at计算所有记录,按时区中的日期计算:

def total_by_date(my_date)    
  where{created_at <= my_date}.count
end

created_at在PostgreSQL中以timestamp格式存储在UTC中,但my_date是Rails应用程序时区中的日期。

如何以正确的方式完成,而不会因为时区转换而造成损失,并且应该created_at首先转换为日期?

1 个答案:

答案 0 :(得分:1)

普通的'ol Date对象的一个​​大问题是它不包含时间信息。因此,在您目前拥有它的查询中,您最终会在指定日期之前获取所有内容,因为查询将解析为WHERE created_at <= '2013-09-27'...之类的内容。在不丢失记录的情况下解决此问题的一种方法是简单地将1天添加到日期对象中,如下所示:

def total_by_date(my_date)    
    where{created_at <= (my_date + 1.day)}.count
end

通过这种方式,您根本不需要担心时区;你只是在看日期部分。

** **编辑

在评论中回答您的问题:

关于+ 1.day的工作原理,请考虑这样的日期:my_date在查询中看起来像2013-09-24,但它基本上与2013-09-24 00:00:00相同。这与9月24日设定为午夜的日期时间/时间戳相同。因此,用简单的英语,如果您的比较是“在9月24日午夜或之前给我一切”,您将获得所有结果,并且比特定的时间和日期早,但在9月24日当天晚些时候发生的任何事情都不会出现。

因此+ 1.day - 相同的“问题”仍然存在,除了它现在对您有利,因为我们的查询现在是“9月25日午夜之前或之前的任何事情”。

注意:从技术上讲,对于9月25日午夜恰好创建的任何内容,您可能会收到不受欢迎的匹配,但您可以轻松地将比较更改为<而不是{{ 1}}解决这个问题。