0

由于某些原因:

Analytic.where({:ga_date.gte => '2010-09-01'}).count()   # greater than or equal to

返回 0,但是

Analytic.where({:ga_date.gte => Time.parse('2010-09-01')}).count()

返回 230,这是记录(文档)的数量。

实际上,顶部的第一行在另一种情况下有效,所以很奇怪。

只能比较日期,因为如果是

Analytic.where({:ga_date.lte => Time.parse('2010-09-10')}).count() # less than or equal to

那么所有日期为 2010-09-10 的记录都不会被计算在内,因为 Time.parse('2010-09-10') 将给出 2010-09-10 00:00:00,所以所有记录都必须是 2010 -09-09 午夜前。换句话说,2010-09-10 2am 将不包括在内,因为 2am 不是“小于或等于”00:00:00。它可以通过使用被黑客入侵

Analytic.where({:ga_date.lte => Time.parse('2010-09-10 23:59:59')}).count()

但这有点难看。如果有一种方法可以像这篇文章的第一行代码那样按日期进行比较?

4

2 回答 2

3

我认为您在这里有两个不同的问题。

不同的数据类型

以下两行不等价。第一个是字符串比较。第二个是与日期对象的比较。

Analytic.where({:ga_date.gte => '2010-09-01'}).count()
Analytic.where({:ga_date.gte => Time.parse('2010-09-01')}).count()

我想你已经弄清楚了,但在这里要清楚很重要。如果您将日期对象存储在数据库中,则需要与日期对象进行比较。

MongoDB 将比较类型数据。

不匹配日期存储

您正在存储具有小时、分钟和秒信息的日期。但是,您不喜欢以下表示法:

:ga_date.lte => Time.parse('2010-09-10 23:59:59')

这里的解决方法是使用$lt和后天。

:ga_date.lt => (Time.parse('2010-09-10') + 1.day) # or (60 * 60 * 24)
于 2011-05-20T20:17:55.357 回答
1

补充一点,它并不奇怪,它恰好在它发生时起作用,日期的字符串表示也恰好在字典上也“大于”另一个日期

其他问题,尝试仅使用所需的尽可能多的数据字段

如果您的意思是“在日历日内”,我通常喜欢在两种情况下都调用 begin_of_day 以平衡这具有中和分钟的效果

否则,如果您真的是在 24 小时打击区内,请使用 ActiveSupport 的“+ 1.day”

于 2011-05-21T04:09:24.557 回答