как делать арифметику с datetime в CQL

Моя цель - удалить фиксированное количество времени с now(). Так что я всегда получаю последние пять минут или последние пять часов.

Как этого добиться?

Документация по cassandra гласит:

Продолжительность может быть добавлена ​​(+) или вычтена (-) из метки времени или даты, чтобы создать новую метку времени или дату. Так, например:
SELECT * FROM myTable WHERE t = '2017-01-01' - 2d
выберет все записи со значением t за последние 2 дня 2016 года.

внутри cqlsh, show version; дает мне:

[cqlsh 5.0.1 | Cassandra 3.11.0 | CQL spec 3.4.4 | Native protocol v4]

Я тестирую со следующей таблицей:

cqlsh:> CREATE TABLE t (
    ...   ts        timestamp,
    ...   PRIMARY KEY (ts)
    ... )
    ... WITH compression = {'class': 'LZ4Compressor'}
    ... AND gc_grace_seconds = 60;

Работает следующий запрос:

SELECT (float)1.55 FROM t WHERE (ts <= toTimestamp(now()));

Следующее не подходит:

cqlsh:> SELECT (float)1.55 FROM t WHERE (ts <= toTimestamp(now() - 1d));
SyntaxException: line 1:57 mismatched input '-' expecting ')' (...ts <= toTimestamp(now() [-]...)
cqlsh:> SELECT (float)1.55 FROM t WHERE (ts <= toTimestamp(now()) - 1d);
SyntaxException: line 1:58 mismatched input '-' expecting ')' (... <= toTimestamp(now()) [-]...)
cqlsh:> SELECT (float)1.55 FROM t WHERE (ts <= toTimestamp(now()) - 1m);
SyntaxException: line 1:58 mismatched input '-' expecting ')' (... <= toTimestamp(now()) [-]...)
cqlsh:> SELECT (float)1.55 FROM t WHERE ts <= toTimestamp(now()) - 1m;
SyntaxException: line 1:57 mismatched input '-' expecting EOF (... <= toTimestamp(now()) [-]...)
cqlsh:> SELECT (float)1.55 FROM t WHERE ts = toTimestamp(now()) - 1m;
SyntaxException: line 1:56 mismatched input '-' expecting EOF (... = toTimestamp(now()) [-]...)

Как вы можете видеть, ошибка всегда связана с - при попытке вычесть продолжительность. (Кстати, с + результат тот же)

Что я делаю неправильно? может быть способ достичь этого, но я не могу понять это!

решение

Для справки, как предложил @Ashraful-Islam, мое решение состояло в том, чтобы создать UDF для выполнения этой работы. Смотри ниже:

CREATE FUNCTION IF NOT EXISTS timeAgo(minutes int) 
  CALLED ON NULL INPUT 
  RETURNS timestamp
  LANGUAGE java AS '
    long now = System.currentTimeMillis();
    if (minutes == null)
      return new Date(now);
    return new Date(now - (minutes.intValue() * 60 * 1000));
  ';

-- So I can do
SELECT timeAgo(60) FROM t;

person Micka    schedule 09.09.2017    source источник


Ответы (1)


Арифметические операторы, представленные в Cassandra 4.0

  • Добавлена ​​поддержка арифметических операторов (CASSANDRA-11935).

Источник: https://github.com/apache/cassandra/blob/trunk/CHANGES.txt#L124


Отредактировано

Если ваша версия cassandra меньше 4.0, вам нужно сделать это на уровне приложения или создать пользовательскую функцию определения (UDF). Проверьте ссылку ниже

Создание пользовательской функции в Cassandra

person Ashraful Islam    schedule 10.09.2017
comment
Ну давай же! Они могли бы, по крайней мере, указать, что последняя версия также означает нестабильную, а также какая часть стабильна или нет ... Спасибо, я обновляю свой вопрос, чтобы сделать его более конструктивным. - person Micka; 10.09.2017
comment
Потрясающий! Благодарю вас! - person Micka; 10.09.2017