如图所示,使用精确时间戳(2013-08-01 15:02:56)查询虽然存在具有该时间戳的行但不返回任何结果,但在查询时返回该行的结果
timestamps > '2013-08-01 15:02:56'
这是 Cassandra 中的正常行为吗?
是的,这是预期的行为。
根据cassandra docs和 here , cassandra 将时间戳存储为“自称为纪元的标准基本时间以来的毫秒数”。
插入数据时,您插入的毫秒值比“2013-08-01 15:02:56”的粒度更高(“现在”的毫秒值与仅秒和 0 毫秒)。除非您插入的时间戳为 0 毫秒,否则 EQ 运算符将永远不会匹配。
这将起作用
SELECT * FROM myTable WHERE timestamps >= '2013-08-01 15:02:56'
AND timestamps < '2013-08-01 15:02:57'
因此,当您通过 cqlsh 查询它时,您的日期时间将转换为一个整数(毫秒),该整数与您最初插入的值不同。您插入的值将是“2013-08-01 15:02:56”之后的几毫秒。您查询完全“2013-08-01 15:02:56”(和 0 毫秒)。使用 GT 或 LT 运算符会匹配,而 EQ 运算符则不会。
希望有帮助!
就像omnibear说的那样,我认为您的问题是时间戳以毫秒> 0的形式存储。
要查看启动下一个查询:
select blobAsBigint(timestampAsBlob(timestamps)) where timestamps > '2013-08-01 15:02:56';
然后检查最后一个数字,即毫秒。
如果最后一个数字 >0(这是我所期望的),那么这就解释了为什么你的 = 断言是错误的。
所以你有两个选择:
...在 15:02:56 之后但在 15:02:57 之前给我事件:
where timestamps >= '2013-08-01 15:02:56' and timestamps < '2013-08-01 15:02:57'
我最近也遇到了同样的问题,这就是我解决它的方法。
使用运算符计算长值blobAsBigint(timestampAsBlob(timestamps))
,然后在 where 子句中使用它'='
。