Cassandra 检索过去24小时内的行

Cassandra 检索过去24小时内的行,cassandra,cql,Cassandra,Cql,我有一个包含以下内容的表(删除了其他字段) 我创建了一个具有以下内容的记录 插入请求审核(用户id、查找时间戳、请求正文)值(?、toTimestamp(now()) 我试图检索过去24小时内的所有行,但时间戳有问题, 我试过了 SELECT*from request\u audit,其中user\u id='1234'和lookup\u timestamp>toTimestamp(now()-“1天”) 还有其他各种方法,可以让你从查询中抽出一天的时间 不能直接从CQL执行,因为它不支持这种表

我有一个包含以下内容的表(删除了其他字段)

我创建了一个具有以下内容的记录

插入请求审核(用户id、查找时间戳、请求正文)值(?、toTimestamp(now())

我试图检索过去24小时内的所有行,但时间戳有问题, 我试过了

SELECT*from request\u audit,其中user\u id='1234'和lookup\u timestamp>toTimestamp(now()-“1天”)

还有其他各种方法,可以让你从查询中抽出一天的时间

不能直接从CQL执行,因为它不支持这种表达式。如果您正在从
cqlsh
运行此查询,则可以尝试用以下内容替换所需的日期:

date--date='-1天'+%F%T%z'
并执行此查询


如果您是从程序中调用它,只需使用相应的日期/时间库来获得相应的日期-1天,但这取决于您使用的语言。

Cassandra对日期操作的支持非常有限。您需要的是一个自定义函数来进行日期数学计算

灵感来自这里。

您可以编写一个UDF(用户定义函数)来更新操作

CREATE FUNCTION dateAdd(date timestamp, day int)     
CALLED ON NULL INPUT     
RETURNS timestamp     
LANGUAGE java     
AS 
$$java.util.Calendar c = java.util.Calendar.getInstance();
c.setTime(date);
c.add(java.util.Calendar.DAY_OF_MONTH, day);
return c.getTime();$$ ;
请记住,您必须在配置中启用UDF。卡桑德拉。希望这是可能的

enable_user_defined_functions: true
一旦完成,这个查询就可以完美地工作

SELECT * from request_audit WHERE user_id = '1234' AND lookup_timestamp > dateAdd(dateof(now()), -1)

24小时前计算的现代代码:
java.time.Instant.now().minus(24,ChronoUnit.hours)
。如果必须有一个遗留类
java.util.Date
对象作为结果,那么将该代码包装在对
Date.from(…)
的调用中。为什么不在主键中添加一个日期(没有时间)?我认为在这种情况下使用不同的分区可能会很好,只是为了避免一个用户获得很多行时出现热点(即使您已经有了一个反向时间序列)。然后通过两个查询(并行)管理最后24小时。
SELECT * from request_audit WHERE user_id = '1234' AND lookup_timestamp > dateAdd(dateof(now()), -1)