我怎样才能在Cassandra中获得当前日期的一部分?在我的特殊情况下,我需要获得一年。
我暂时到达select dateof(now()) from system.local;
但我找不到任何功能来获得文档中的年份 https://docs.datastax.com/en/dse/5.1/cql/cql/cql_reference/refCqlFunction.html#refCqlFunction__toTimestamp
我是Cassandra的新人,所以这可能是一个愚蠢的问题。
答案 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)