10

図に示すように、正確なタイムスタンプ (2013-08-01 15:02:56) を使用してクエリを実行しても結果は返されませんが、そのタイムスタンプを持つ行は存在しますが、クエリを実行するとその行の結果が返されます。

timestamps > '2013-08-01 15:02:56'

これは Cassandra の通常の動作ですか? ここに画像の説明を入力

4

3 に答える 3

11

はい、これは予想される動作です。

cassandra docs and here hereによると、cassandraはタイムスタンプを「エポックと呼ばれる標準ベース時間からのミリ秒」として保存しています。

データを挿入するときは、「2013-08-01 15:02:56」よりも粒度の高いミリ秒の値を挿入します (「今」のミリ秒の値と 0 ミリ秒のみのミリ秒の値)。EQ 演算子は、挿入されたタイムスタンプが 0 ミリ秒でない限り一致しません。

これはうまくいきます

SELECT * FROM myTable WHERE timestamps >= '2013-08-01 15:02:56'
AND timestamps < '2013-08-01 15:02:57' 

そのため、cqlsh を使用してクエリを実行すると、datetime は、最初に挿入した値とは異なる (ミリ秒単位の) 整数に変換されます。挿入された値は、「2013-08-01 15:02:56」の数ミリ秒後になります。EXACTLY "2013-08-01 15:02:56" (および 0 ミリ秒) をクエリします。GT または LT オペレーターを使用すると一致しますが、EQ オペレーターは一致しません。

それが役立つことを願っています!

于 2013-08-02T13:26:27.623 に答える
11

オムニベアが言ったように、あなたの問題は、タイムスタンプがミリ秒> 0で保存されていることだと思います。

それを確認するには、次のクエリを起動します。

select  blobAsBigint(timestampAsBlob(timestamps)) where timestamps > '2013-08-01 15:02:56';

次に、ミリ秒である最後の数字を確認します。

最後の数字が >0 の場合 (これは私が予想することです)、これは = アサーションが false である理由を説明しています。

したがって、次の 2 つのオプションがあります。

  1. データを保存するときにミリ秒を削除します
  2. 範囲を使用したクエリなど..

...15:02:56 から 15:02:57 までのイベントを教えてください:

where timestamps >= '2013-08-01 15:02:56' and timestamps < '2013-08-01 15:02:57'
于 2015-09-30T10:35:17.800 に答える
1

私も最近同じ問題に直面しましたが、これが私がそれを解決する方法です。

を使用して long 値を計算しblobAsBigint(timestampAsBlob(timestamps))、それを where 句と'='演算子で使用します。

于 2018-12-21T09:34:06.317 に答える