Моя цель - удалить фиксированное количество времени с 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;