我怎样才能在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没有任何可以帮助解决这个问题的功能。但是,您可以编写用户定义的函数(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)