在CQL中是否可以“获取早于N天的记录”?

问题描述 投票:0回答:2

我有一个需求,需要获取所有早于 N 天的记录。由于 Cassandra 不支持 SQL 中可用的 GETDATE() 并有助于完成相同的任务,因此 CQL 中可能的解决方案是什么?下面给出SQL查询,供参考,

Select * from table where created_date < GETDATE() - 'NDays'

cassandra cql
2个回答
1
投票

有一个本地 CQL 函数

CURRENTDATE()
以日期格式返回系统时间,但 CQL 语法中没有允许该级别操作的运算符。

我们的一般建议是在您的应用程序中执行计算,然后将结果提供给您的 CQL 查询。

附带说明,基于范围过滤器检索多个分区对于 Cassandra 来说是一种糟糕的访问模式。

Cassandra 专为互联网规模的高速读取而设计,尤其是非常快速地检索单个分区。如果您需要在查询中检索多条记录,很有可能 (a) 您有一个分析用例(而不是 OLTP),(b) 您的数据模型有误,或者 (c) 两者都有。干杯!


0
投票

从 Erick 的回答“是”的角度来回答您的问题,只要您构建了支持该查询的表。几年前我写了一篇关于在 Apache Cassandra 4.0 中使用算术运算符和日期类型的文章:Apache Cassandra 4.0 中的算术运算符

如果我为“书呆子假期”的数据构建一个表,结构将如下所示:

CREATE TABLE nerd_holidays (
  year_bucket BIGINT,
  event_date DATE,
  name TEXT,
  id UUID,
  PRIMARY KEY ((year_bucket), event_date, id)
) WITH CLUSTERING ORDER BY (event_date ASC, id ASC);

然后我可以像这样提取接下来 30 天的数据:

> SELECT event_date, name
  FROM nerd_holidays WHERE year_bucket=2023
  AND event_date >= toDate(now())
  AND event_date < toDate(now()) + 30d;

 event_date | name
------------+----------------------------
 2023-04-30 | International Tabletop Day
 2023-05-04 |              Star Wars Day

(2 rows)
© www.soinside.com 2019 - 2024. All rights reserved.