2013-08-02 58 views
7

如图所示,使用确切时间戳查询(2013-08-01 15:02:56)不会返回任何结果,尽管存在具有该时间戳的行,但在查询时返回包含该行的结果cassandra中的时间戳比较

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

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

回答

9

是的,这是预期的行为。

根据the cassandra docs和这里的here,cassandra将时间戳存储为“自标准基准时间以来的毫秒数,称为时期”。

插入数据时,会插入一个毫秒值,其粒度比“2013-08-01 15:02:56”(毫秒的“现在”值,而不仅仅是秒和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运营商不会。

希望有帮助!

+0

谢谢@ominbear该字段是时间戳而不是TimeUUID。我也尝试了带时区的查询,但结果相同。根据哪种cassandra行为是否有这样的规则?此外,我只是好奇,为什么有TimeUUID时使用时间戳? –

+0

查看更新的答案 – omnibear

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' 
+1

您的答案值得更多的信用,因为这是我花费大量时间搜索后才能找到的唯一真实答案。 –