如何获得cassandra的当前年份

问题描述 投票:1回答:1

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

我到目前为止select dateof(now()) from system.local;

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

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

cassandra cql cassandra-3.0
1个回答
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)
© www.soinside.com 2019 - 2024. All rights reserved.