检索过去24小时的行

7fyelxc5  于 2021-06-14  发布在  Cassandra
关注(0)|答案(2)|浏览(429)

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

CREATE TABLE if NOT EXISTS request_audit (
   user_id text,
   request_body text,
   lookup_timestamp TIMESTAMP
   PRIMARY KEY ((user_id), lookup_timestamp)
) WITH CLUSTERING ORDER BY ( lookup_timestamp DESC);

我用以下内容创建一个记录 INSERT INTO request_audit (user_id, lookup_timestamp, request_body) VALUES (?, ?, toTimestamp(now())) 我试图检索过去24小时内的所有行,但时间戳有问题,我已经尝试了 SELECT * from request_audit WHERE user_id = '1234' AND lookup_timestamp > toTimestamp(now() - "1 day" ) 以及其他各种方法,试图从查询中抽出一天的时间。

5lwkijsr

5lwkijsr1#

Cassandra的日期操作支持非常有限。您需要的是一个自定义函数来进行日期数学计算。
灵感来自这里。如何使用cassandra查询将过去6个月的数据与timestamp列进行比较?
您可以编写一个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();$$ ;

请记住,您必须在config中启用udf。Cassandra·伊梅尔。希望这是可能的。

enable_user_defined_functions: true

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

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

zvms9eto2#

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

date --date='-1 day' '+%F %T%z'

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

相关问题