我必须进行查询以获取,然后使用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
首先转换为日期?
答案 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}}解决这个问题。