cassandra中的时间戳比较

时间:2013-08-02 12:02:25

标签: timestamp cassandra cql3

如图所示,使用确切的时间戳(2013-08-01 15:02:56)查询并未返回任何结果,但存在具有该时间戳的行但在查询时返回带有该行的结果

  

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

这是卡桑德拉的正常行为吗? enter image description here

3 个答案:

答案 0 :(得分:11)

是的,这是预期的行为。

根据the cassandra docshere,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(这是我所期望的),那么这就解释了为什么你的=断言是错误的。

所以你有两个选择:

  1. 存储数据时删除毫秒
  2. 使用范围查询,例如......
  3. ...在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子句中使用它。