0

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

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

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

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

4

1 回答 1

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 日午夜创建的任何内容,您可能会得到不想要的匹配,但您可以轻松地将比较更改为简单<而不是<=修复该问题。

于 2013-09-27T15:05:59.713 回答