Как получить текущий год на Кассандре
Как я могу получить только часть текущей даты в Кассандре? В моем конкретном случае мне нужно получить только год.
Я дошел до этого на данный момент select dateof(now()) from system.local;
Но я не смог найти никакой функции, чтобы получить только год в документации https://docs.datastax.com/en/dse/5.1/cql/cql/cql_reference/refCqlFunction.html
Я новичок с Кассандрой, так что это может быть глупый вопрос.
1 ответ
Безопасный способ - вернуть временную метку и проанализировать год на стороне клиента.
Собственно, у Кассандры нет функций, которые могут помочь с этим. Однако вы можете написать пользовательскую функцию (UDF) для выполнения этого:
Во-первых, пользовательские функции по умолчанию отключены. Вам нужно будет отрегулировать этот параметр в вашем cassandra.yaml и перезапустить ваши узлы.
enable_user_defined_functions=true
ПРИМЕЧАНИЕ. Этот параметр по умолчанию установлен по этой причине. Несмотря на то, что в Cassandra 3.x предусмотрены некоторые средства защиты от вредоносного кода, рекомендуется отключить эту функцию, если только она вам не нужна и вы не знаете, что делаете. И даже тогда вы захотите следить за определяемыми UDF.
Теперь я создам свою функцию с помощью Java из cqlsh:
cassdba@cqlsh:stackru> 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:stackru> 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 stackru.year(todate(now())) as year FROm system.local;
year
------
2017
(1 rows)