Как получить текущий год на Кассандре

Как я могу получить только часть текущей даты в Кассандре? В моем конкретном случае мне нужно получить только год.

Я дошел до этого на данный момент 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)
Другие вопросы по тегам