如何获得cassandra的当前年份

时间:2017-12-20 20:14:35

标签: cassandra cql cassandra-3.0

我怎样才能在Cassandra中获得当前日期的一部分?在我的特殊情况下,我需要获得一年。

我暂时到达select dateof(now()) from system.local;

但我找不到任何功能来获得文档中的年份 https://docs.datastax.com/en/dse/5.1/cql/cql/cql_reference/refCqlFunction.html#refCqlFunction__toTimestamp

我是Cassandra的新人,所以这可能是一个愚蠢的问题。

1 个答案:

答案 0 :(得分:3)

安全方式是返回时间戳并解析客户端年份。

当然,Cassandra没有任何可以帮助解决此问题的功能。但是,您可以编写用户定义的函数(UDF)来完成此任务:

首先,默认情况下禁用用户定义的函数。您需要在cassandra.yaml中调整该设置并重新启动您的节点。

enable_user_defined_functions=true

注意:出于某种原因,此设置默认为此方式。虽然Cassandra 3.x有一些保护措施可以防止恶意代码,但是除非你需要它并且你知道自己在做什么,否则最好不要使用它。即便如此,您还要关注定义的UDF。

现在我将使用Java在cqlsh:

中创建我的函数
cassdba@cqlsh:stackoverflow> CREATE OR REPLACE FUNCTION year (input DATE)
RETURNS NULL ON NULL INPUT RETURNS TEXT
LANGUAGE java AS 'return input.toString().substring(0,4);';

请注意,查询当前日期/时间有多种方式(和类型):

cassdba@cqlsh:stackoverflow> SELECT todate(now()) as date,
    totimestamp(now()) as timestamp, now() as timeuuid FROm system.local;

 date       | timestamp                       | timeuuid
------------+---------------------------------+-------------------------------------
 2017-12-20 | 2017-12-20 21:18:37.708000+0000 | 58167cc1-e5cb-11e7-9765-a98c427e8248

(1 rows)

要仅返回一年,我可以在year列上调用todate(now())函数:

SELECT stackoverflow.year(todate(now())) as year FROm system.local;

 year
------
 2017

(1 rows)