安全的方法是返回一个时间戳并在客户端解析出年份。
Cassandra 本身没有任何功能可以帮助解决这个问题。但是,您可以编写用户定义函数 (UDF) 来完成此操作:
首先,默认情况下禁用用户定义的功能。您需要在 cassandra.yaml 中调整该设置并重新启动节点。
enable_user_defined_functions=true
注意:此设置默认采用这种方式是有原因的。尽管 Cassandra 3.x 有一些适当的保护措施来防止恶意代码,但最好将其关闭,除非您需要它并且您知道自己在做什么。即便如此,您仍需要密切关注已定义的 UDF。
现在我将在 cqlsh 中使用 Java 创建我的函数:
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)
只返回一年,我可以在todate(now()) 列上调用我的year 函数:
SELECT stackoverflow.year(todate(now())) as year FROm system.local;
year
------
2017
(1 rows)