简短版本:是否可以查询与特定日期对应的所有timeuuid列?
更多详情:
我的表格定义如下:
CREATE TABLE timetest(
key uuid,
activation_time timeuuid,
value text,
PRIMARY KEY(key,activation_time)
);
我用一行填充了这一行,如下所示(f0532ef0-2a15-11e3-b292-51843b245f21
是与日期2013-09-30 22:19:06+0100
对应的timeuuid):
insert into timetest (key, activation_time, value) VALUES (7daecb80-29b0-11e3-92ec-e291eb9d325e, f0532ef0-2a15-11e3-b292-51843b245f21, 'some value');
我可以按如下方式查询该行:
select activation_time,dateof(activation_time) from timetest where key=7daecb80-29b0-11e3-92ec-e291eb9d325e
导致以下结果(使用cqlsh)
activation_time | dateof(activation_time)
--------------------------------------+--------------------------
f0532ef0-2a15-11e3-b292-51843b245f21 | 2013-09-30 22:19:06+0100
现在让我们假设我的表格中有很多数据,并且我想要检索activation_time
对应于特定日期的所有行,例如2013-09-30 22:19:06+0100
。
我希望能够查询minTimeuuid('2013-09-30 22:19:06+0100')
和maxTimeuuid('2013-09-30 22:19:06+0100')
之间的所有时间范围,但这似乎不可能(以下查询返回零行):
select * from timetest where key=7daecb80-29b0-11e3-92ec-e291eb9d325e and activation_time>minTimeuuid('2013-09-30 22:19:06+0100') and activation_time<=maxTimeuuid('2013-09-30 22:19:06+0100');
似乎我需要使用一个hack,我在查询中增加第二个日期(一秒钟)以捕获行,即
select * from timetest where key=7daecb80-29b0-11e3-92ec-e291eb9d325e and activation_time>minTimeuuid('2013-09-30 22:19:06+0100') and activation_time<=maxTimeuuid('2013-09-30 22:19:07+0100');
这感觉不对。我错过了什么吗?有更清洁的方法吗?
CQL文档讨论了timeuuid functions,但是对于带有timeuuids的gte / lte表达式来说,它很短:
min / maxTimeuuid示例选择timeuuid列t严格晚于2013-01-01 00:05 + 0000但严格早于2013-02-02 10:00 + 0000的所有行。 t> = maxTimeuuid('2013-01-01 00:05 + 0000')不选择完全在2013-01-01 00:05 + 0000生成的timeuuid,并且基本上等于t&gt; maxTimeuuid('2013-01-01 00:05 + 0000')。
P.S。以下查询也返回零行:
select * from timetest where key=7daecb80-29b0-11e3-92ec-e291eb9d325e and activation_time<=maxTimeuuid('2013-09-30 22:19:06+0100');
并且以下查询返回行:
select * from timetest where key=7daecb80-29b0-11e3-92ec-e291eb9d325e and activation_time>minTimeuuid('2013-09-30 22:19:06+0100');
答案 0 :(得分:8)
我确定问题是cqlsh没有显示时间戳的毫秒数 所以真正的时间戳就像'2013-09-30 22:19:06.123 + 0100' 当您以毫秒为单位调用maxTimeuuid('2013-09-30 22:19:06 + 0100')时,假设为零,因此它与调用maxTimeuuid相同('2013-09-30 22:19:06.000 + 0100 “)
22:19:06.123&gt; 22:19:06.000导致记录被过滤掉。
答案 1 :(得分:0)
与答案没有直接关系,但作为@dimas答案的附加插件 cqlsh(版本5.0.1)似乎现在显示毫秒
system.dateof(id)
---------------------------------
2016-06-03 02:42:09.990000+0000
2016-05-28 17:07:30.244000+0000