Как MongoDB сравнивает только дату и игнорирует время, например, дата <= '2010-09-10'? - PullRequest
0 голосов
/ 16 сентября 2010

По какой-то причине:

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 2:00 не будут включены, потому что 2:00 не «меньше или равно» 00:00:00. Его можно взломать с помощью

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

но это некрасиво. Если есть способ сравнить по дате только как первая строка кода в этом посте?

Ответы [ 2 ]

3 голосов
/ 21 мая 2011

Я думаю, что у вас есть две отдельные проблемы здесь.

Различные типы данных

Следующие две строки не эквивалентны. Первое сравнение строк. Второй - сравнение с объектом даты.

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 голос
/ 21 мая 2011

добавить, это не странно работает, это случайно работает, когда просто случается, что строковое представление даты также лексикографически «больше» другой даты

другой вопрос, старайтесь использовать столько полей данных, сколько необходимо

если вы имели в виду, что это «в течение календарного дня», что мне обычно нравится, так это вызывать begin_of_day в обоих случаях, чтобы выровнять это имеет эффект нейтрализации минут

иначе, если вы действительно имели в виду 24-часовую зону удара, используйте ActiveSupport '+ 1.day'

...