10

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

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

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

4

3 回答 3

11

是的,这是预期的行为。

根据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 运算符则不会。

希望有帮助!

于 2013-08-02T13:26:27.623 回答
11

就像omnibear说的那样,我认为您的问题是时间戳以毫秒> 0的形式存储。

要查看启动下一个查询:

select  blobAsBigint(timestampAsBlob(timestamps)) where timestamps > '2013-08-01 15:02:56';

然后检查最后一个数字,即毫秒。

如果最后一个数字 >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'
于 2015-09-30T10:35:17.800 回答
1

我最近也遇到了同样的问题,这就是我解决它的方法。

使用运算符计算长值blobAsBigint(timestampAsBlob(timestamps)),然后在 where 子句中使用它'='

于 2018-12-21T09:34:06.317 回答