図に示すように、正確なタイムスタンプ (2013-08-01 15:02:56) を使用してクエリを実行しても結果は返されませんが、そのタイムスタンプを持つ行は存在しますが、クエリを実行するとその行の結果が返されます。
timestamps > '2013-08-01 15:02:56'
これは Cassandra の通常の動作ですか?
はい、これは予想される動作です。
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 オペレーターは一致しません。
それが役立つことを願っています!
オムニベアが言ったように、あなたの問題は、タイムスタンプがミリ秒> 0で保存されていることだと思います。
それを確認するには、次のクエリを起動します。
select blobAsBigint(timestampAsBlob(timestamps)) where timestamps > '2013-08-01 15:02:56';
次に、ミリ秒である最後の数字を確認します。
最後の数字が >0 の場合 (これは私が予想することです)、これは = アサーションが false である理由を説明しています。
したがって、次の 2 つのオプションがあります。
...15:02:56 から 15:02:57 までのイベントを教えてください:
where timestamps >= '2013-08-01 15:02:56' and timestamps < '2013-08-01 15:02:57'
私も最近同じ問題に直面しましたが、これが私がそれを解決する方法です。
を使用して long 値を計算しblobAsBigint(timestampAsBlob(timestamps))
、それを where 句と'='
演算子で使用します。