【问题标题】:Timestamp comparison in cassandracassandra中的时间戳比较
【发布时间】:2018-12-21 17:34:06
【问题描述】:

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

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

这是 Cassandra 中的正常行为吗?

【问题讨论】:

    标签: timestamp cassandra cql3


    【解决方案1】:

    是的,这是预期的行为。

    根据the 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 查询它时,您的 datetime 将转换为与您最初插入的值不同的整数(毫秒)。您插入的值将在“2013-08-01 15:02:56”之后几毫秒。您查询完全“2013-08-01 15:02:56”(和 0 毫秒)。使用 GT 或 LT 运算符会匹配,而 EQ 运算符则不会。

    希望有帮助!

    【讨论】:

    • 感谢@ominbear 该字段是时间戳而不是 TimeUUID。我也试过用时区查询,但结果是一样的。有没有这样的cassandra行为规则。我也很好奇,为什么在有 TimeUUID 的情况下使用时间戳?
    【解决方案2】:

    就像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'
    

    【讨论】:

    • 您的答案值得更多赞誉,因为这是我花了很多时间寻找它后唯一能找到的真正答案。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-09
      • 2017-08-26
      • 1970-01-01
      • 2015-09-22
      • 2017-06-24
      • 2018-03-10
      • 1970-01-01
      相关资源
      最近更新 更多