cassandra中的时间戳比较

Vis*_*mud 7 timestamp cassandra cql3

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

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

这是Cassandra的正常行为吗? 在此输入图像描述

Joh*_*ohn 11

是的,这是预期的行为.

根据该卡桑德拉文档和这里这里,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' 
Run Code Online (Sandbox Code Playgroud)

因此,当您通过cqlsh查询它时,您的日期时间将转换为一个整数(毫秒),该整数与您最初插入的值不同.您插入的值将在"2013-08-01 15:02:56"之后的几毫秒内完成.您查询完全"2013-08-01 15:02:56"(和0毫秒).使用GT或LT运算符将匹配,EQ运算符不会.

希望有所帮助!


Car*_*des 11

像omnibear一样,我认为你的问题是时间戳以毫秒> 0存储.

要查看启动下一个查询:

select  blobAsBigint(timestampAsBlob(timestamps)) where timestamps > '2013-08-01 15:02:56';
Run Code Online (Sandbox Code Playgroud)

然后检查最后的数字,即毫秒.

如果最后的数字> 0(这是我所期望的),那么这就解释了为什么你的=断言是错误的.

所以你有两个选择:

  1. 存储数据时删除毫秒
  2. 查询范围,如...

...在15:02:56之后但在15:02:57之前给我一些事件:

where timestamps >= '2013-08-01 15:02:56' and timestamps < '2013-08-01 15:02:57'
Run Code Online (Sandbox Code Playgroud)