【发布时间】:2018-12-21 17:34:06
【问题描述】:
如图所示,使用确切的时间戳查询(2013-08-01 15:02:56)虽然存在具有该时间戳的行,但未返回任何结果,但在查询时返回该行的结果
timestamps > '2013-08-01 15:02:56'
这是 Cassandra 中的正常行为吗?
【问题讨论】:
如图所示,使用确切的时间戳查询(2013-08-01 15:02:56)虽然存在具有该时间戳的行,但未返回任何结果,但在查询时返回该行的结果
timestamps > '2013-08-01 15:02:56'
这是 Cassandra 中的正常行为吗?
【问题讨论】:
是的,这是预期的行为。
根据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 运算符则不会。
希望有帮助!
【讨论】:
就像omnibear说的那样,我认为你的问题是时间戳是以毫秒> 0存储的。
要查看启动下一个查询:
select blobAsBigint(timestampAsBlob(timestamps)) where timestamps > '2013-08-01 15:02:56';
然后检查最后的数字是毫秒。
如果最后一个数字 >0(这是我所期望的),那么这就解释了为什么你的 = 断言是错误的。
所以你有两个选择:
...在 15:02:56 之后但在 15:02:57 之前给我事件:
where timestamps >= '2013-08-01 15:02:56' and timestamps < '2013-08-01 15:02:57'
【讨论】:
我最近也遇到了同样的问题,这就是我解决它的方法。
使用blobAsBigint(timestampAsBlob(timestamps)) 计算长值,然后在带有'=' 运算符的where 子句中使用它。
【讨论】: