【问题标题】:Cassandra - get interval contains given timestampCassandra - 获取间隔包含给定的时间戳
【发布时间】:2018-07-17 23:56:04
【问题描述】:

我在 Cassandra 有桌子:

CREATE TABLE test (
 bucket int,  
 start timestamp,
 end timestamp,  
 PRIMARY KEY((bucket),start, end)
);

我想得到这样的查询:

SELECT * FROM test where bucket = 1 and start <= current_time and end >= current_time

换句话说,我想找到包含给定时间戳的区间。

我知道查询是错误的。我也尝试使用多列切片限制来做到这一点,但在这种情况下它也没有用。有没有办法做到这一点?

【问题讨论】:

标签: cassandra cql


【解决方案1】:

我过去也遇到过类似的问题。我这样做的方式是使用列来跟踪开始/结束。然后有一排作为事件的开始,一排作为结束。让我们尝试创建一个表来存储“Nerd Holidays”,如下所示:

CREATE TABLE nerd_holidays (
  month_bucket int,  
  event_time timestamp,
  beginend text,  
  name text,
  PRIMARY KEY ((month_bucket), event_time, beginend)
) WITH CLUSTERING ORDER BY (event_time DESC, beginend ASC);

我将插入一些行:

INSERT INTO nerd_holidays (month_bucket, event_time, beginend, name)
VALUES (3,'2018-03-14 00:00:00','begin','Pi Day');
INSERT INTO nerd_holidays (month_bucket, event_time, beginend, name)
VALUES (3,'2018-03-14 23:59:59','end','Pi Day');
INSERT INTO nerd_holidays (month_bucket, event_time, beginend, name)
VALUES (5,'2018-05-04 00:00:00','begin','Star Wars Day');
INSERT INTO nerd_holidays (month_bucket, event_time, beginend, name)
VALUES (5,'2018-05-04 23:59:59','end','Star Wars Day');
INSERT INTO nerd_holidays (month_bucket, event_time, beginend, name)
VALUES (9,'2018-09-19 00:00:00','begin','Talk Like a Pirate Day');
INSERT INTO nerd_holidays (month_bucket, event_time, beginend, name)
VALUES (9,'2018-09-19 23:59:59','end','Talk Like a Pirate Day');
INSERT INTO nerd_holidays (month_bucket, event_time, beginend, name)
VALUES (9,'2018-09-25 00:00:00','begin','Hobbit Day');
INSERT INTO nerd_holidays (month_bucket, event_time, beginend, name)
VALUES (9,'2018-09-25 23:59:59','end','Hobbit Day');

现在我可以查询 9 月份特定时间的数据,如下所示:

cassdba@cqlsh:stackoverflow> SELECT * FROM nerd_holidays
    WHERE month_bucket=9
    AND event_time >= '2018-09-18 00:00'
    AND event_time <= '2018-09-19 08:33' ;

 month_bucket | event_time                      | beginend | name
--------------+---------------------------------+----------+------------------------
            9 | 2018-09-19 05:00:00.000000+0000 |    begin | Talk Like a Pirate Day

(1 rows)

如您所见,“Talk Like a Pirate Day”在请求的日期范围内开始。

【讨论】:

  • 感谢您的回答,但我认为这不能解决我的问题。我需要一个与你不同的查询。再次查看我的查询。如果我使用您的架构,我将从存储桶中获取所有行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-27
  • 1970-01-01
  • 2015-08-20
  • 2013-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多