【问题标题】:Fetch and count records by Date按日期获取和统计记录
【发布时间】:2013-10-03 21:26:25
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我对@9​​87654327@ 子句有点困惑。是否将 total_by_date 作为范围调用?您是否使用任何类型的 gem 进行查询?

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


【解决方案1】:

普通的 'ol Date 对象的大问题是它不包含时间信息。因此,在您目前拥有的查询中,您最终会在指定日期之前获得所有内容,因为查询将解析为WHERE created_at &lt;= '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 日午夜创建的任何内容,您可能会得到不希望的匹配,但您可以轻松地将比较更改为简单的 &lt; 而不是 &lt;=解决这个问题。

【讨论】:

  • 嗨,Teeg,感谢您的回答。是的,我忘了在这里提到 Squeel,所以一般来说,查询本身一切都很好。现在我正试图围绕+ 1.day 的东西,弄清楚它为什么起作用(它是!好吧.. 看起来像......)。无法获得,为什么如果我将2013-09-24 设置为my_date2013-09-24 13:06:22 作为created_atmy_date 将在指定日期之前。很奇怪。
  • 这样想日期:my_date 看起来像2013-09-24,但它与2013-09-24 00:00:00 基本相同。这与设置为 9 月 24 日午夜的日期时间/时间戳相同。因此,如果您的比较是“9 月 24 日午夜或之前的任何时间”,那么您将获得所有出现的结果,并且早于该时间并且存在日期,但 9 月 24 日当天晚些时候发生的任何事情都不会出现。因此,`+ 1.day` - 同样的“问题”仍然存在,只是它现在对您有利,因为我们的查询现在是“9 月 25 日午夜或之前的任何事情”。
  • @LeoBurt 为答案添加了更多说明。希望对您有所帮助。
  • 哦,我明白了。我非常感谢您的支持。荣誉。
  • @LeoBurt 没有问题。祝你好运。
猜你喜欢
  • 1970-01-01
  • 2020-12-16
  • 1970-01-01
  • 1970-01-01
  • 2019-06-05
  • 2017-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多