我有一个需求,需要获取所有早于 N 天的记录。由于 Cassandra 不支持 SQL 中可用的 GETDATE() 并有助于完成相同的任务,因此 CQL 中可能的解决方案是什么?下面给出SQL查询,供参考,
Select * from table where created_date < GETDATE() - 'NDays'
有一个本地 CQL 函数
CURRENTDATE()
以日期格式返回系统时间,但 CQL 语法中没有允许该级别操作的运算符。
我们的一般建议是在您的应用程序中执行计算,然后将结果提供给您的 CQL 查询。
附带说明,基于范围过滤器检索多个分区对于 Cassandra 来说是一种糟糕的访问模式。
Cassandra 专为互联网规模的高速读取而设计,尤其是非常快速地检索单个分区。如果您需要在查询中检索多条记录,很有可能 (a) 您有一个分析用例(而不是 OLTP),(b) 您的数据模型有误,或者 (c) 两者都有。干杯!
从 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)