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

Time.parse('2010-09-10') は 2010-09-10 00:00:00 を与えるため、日付が 2010-09-10 のすべてのレコードはカウントされないため、レコードはすべて 2010 年でなければなりません。 -09-09 午前 0 時前。つまり、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

ここには2つの別々の問題があると思います。

さまざまなデータ型

次の 2 行は同等ではありません。最初は文字列比較です。2 つ目は、日付オブジェクトとの比較です。

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

あなたはこれを理解したと思いますが、ここで明確にすることが重要です。日付オブジェクトを DB に格納する場合は、日付オブジェクトとの比較を実行する必要があります。

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 に答える