#date #math #cassandra #cassandra-4.0
#Дата #математика #кассандра #кассандра-4.0
Вопрос:
Данные, которые я загружаю в Cassandra, содержат даты (тип метки времени). Мне нужно выполнить вычисления с этими датами, чтобы вычислить, например, разницу между заданной датой и now() или между двумя столбцами даты (тип метки времени).
Я пытался:
SELECT x, date_1 - date_2 as age FROM y WHERE a = 'z';
Я попробовал использовать круглые скобки, предложение ‘AS’ и приведение временных меток к типу даты, но получил ошибки.
Я также попытался создать UDF (определяемую пользователем функцию):
CREATE OR REPLACE FUNCTION x.age_calc (tounixtimestamp(date_1) int, tounixtimestamp(date_2) int) RETURNS NULL ON NULL INPUT RETURNS int LANGUAGE java AS 'return Integer.valueOf(Math.abs(tounixtimestamp(date_1) - tounixtimestamp(date_2)))';
Я вижу, что приведенный выше UDF имеет неправильный синтаксис, но не совсем понимаю, как / где это исправить.
Я хочу, например, получить разницу в миллисекундах и преобразовать ее в годы или месяцы.(надеюсь, часть преобразования проста)
Я уверен, что я близок к достижению цели, но мой синтаксис во всех опробованных примерах неверен.
Поиск в Интернете в течение нескольких дней не дал действительно похожих примеров.
Я предполагаю, что Кассандра 4 может это сделать.
Версии: Версия Cassandra: 4.0-beta2, cqlsh 5.0.1
Комментарии:
1. Арифметика даты разрешена только в
WHERE
предложении, и то только с соответствующимduration
типом, на основе issues.apache.org/jira/browse/CASSANDRA-11936 .
Ответ №1:
Самый простой способ сделать то, что вы хотите, это:
SELECT x, toUnixTimestamp(date_1) - toUnixTimestamp(date_2) as age FROM y WHERE a = 'z';
Комментарии:
1. Спасибо @benjamin-lerer. Сработало отлично. Я думаю, что я попробовал это в Cassandra3 и потерпел неудачу, но не снова в Cassamdra4. Я в значительной степени сдался. Так что еще раз спасибо. Арифметика даты Cassandra была бы отличной темой для сообщения в блоге.