2010-09-15 142 views
0

出于某种原因:MongoDB如何比较日期而忽略时间,比如date <='2010-09-10'?

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年9月10日凌晨2点将不会包含,因为凌晨2点不是“小于或等于”00:00:00。它可以被黑客使用

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

但它是一种丑陋。如果有一种方法可以按日期进行比较,就像本文中的第一行代码一样?

回答

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) 
1

增加, 是不奇怪的作品,其巧合的作品时,它恰好日期的字符串表示恰巧也按字典是其他日期“大于”

其它问题, 尽量只使用尽可能多的数据字段需要

如果你的意思是它是“日历天之内”, 我平时喜欢是调用beginning_of_day在这两种情况下扳平 这个具有中纪要的影响

否则,如果您的确意思是在24小时内, 使用ActiveSupport的'+ 1.day'