我有一个要求,需要获取所有记录超过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中使用算术运算符和日期类型的文章:
如果我建立一个关于"书呆子假期"的数据表,该结构看起来像这样:
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)