如图所示,使用确切的时间戳(2013-08-01 15:02:56)查询并未返回任何结果,但存在具有该时间戳的行但在查询时返回带有该行的结果
timestamps > '2013-08-01 15:02:56'
这是卡桑德拉的正常行为吗?
答案 0 :(得分:11)
是的,这是预期的行为。
根据the cassandra docs和here,cassandra将时间戳存储为“自标准基准时间以来称为纪元的毫秒数”。
插入数据时,插入的粒度高于“2013-08-01 15:02:56”的毫秒值(“now”的毫秒值vs秒和0毫秒)。 EQ运算符永远不会匹配,因为插入的时间戳有0毫秒。
这将有效
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运算符不会。
希望有所帮助!
答案 1 :(得分:11)
像omnibear一样,我认为你的问题是时间戳以毫秒&gt; 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'
答案 2 :(得分:1)
我最近也遇到了同样的问题,这就是我解决的方法。
使用blobAsBigint(timestampAsBlob(timestamps))
计算long值,然后使用'='
运算符在where子句中使用它。