Столбец метки времени запроса Кассандры

Использование Cassandra 2.28, Drive 3, Sparks2. У меня есть столбец меток времени в Кассандре, мненужно запросить его только по части даты. Если я сделаю запрос по дате: .where("TRAN_DATE= ?", "2012-01-21": это не приносит никакого результата. Если я включу часть времени, это говорит о недопустимой дате. Мои данные (как я могу прочитать в cqlsh): 2012-01-21 08: 01: 00 + 0000

param: "2012-01-21"> Нет ошибок, но нет результатов

param: "2012-01-21 08:01:00" > Ошибка: недопустимая дата

параметр: "2012-01-21 08:01:00+0000" > Ошибка: недопустимая дата

SimpleDateFormat DATE_FORMAT = новый SimpleDateFormat("гггг / мм / дд"); TRAN_DATE = DATE_FORMAT.parse("19.01.2012"); Использовали массовый загрузчик /SSLoader для загрузки таблицы

Данные в таблице:

tran_date                | id
--------------------------+-------
 2012-01-14 08:01:00+0000 |    ABC
 2012-01-24 08:01:00+0000 |    ABC
 2012-01-23 08:01:00+0000 |    ALM
 2012-01-29 08:01:00+0000 |    ALM
 2012-01-13 08:01:00+0000 |    ATC
 2012-01-15 08:01:00+0000 |    ATI
 2012-01-18 08:01:00+0000 |    FKT
 2012-01-05 08:01:00+0000 |    NYC
 2012-01-11 08:01:00+0000 |    JDU
 2012-01-04 08:01:00+0000 |    LST

Как мне это решить.

Спасибо

1 ответ

Если вы вставляете данные в столбец отметки времени без указания часового пояса, как этот:

INSERT INTO timestamp_test (tran_date , id ) VALUES ('2016-12-19','TMP')

Кассандра выберет координатора часового пояса

Если часовой пояс не указан, используется часовой пояс узла-координатора Cassandra, обрабатывающего запрос на запись. Для точности DataStax рекомендует указывать часовой пояс, а не полагаться на часовой пояс, настроенный на узлах Cassandra.

Если вы выполняете select с помощью драйвера Datastax, вам нужно конвертировать строковую дату в java.util.Date и установить часовой пояс узла-координатора, в моем случае это было GMT+6

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date = dateFormat.parse("2012-01-21");
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT+6")); //Change this time zone

Теперь вы можете запросить с

QueryBuilder.eq("TRAN_DATE", date)

Вот полная демонстрация:

try (Cluster cluster = Cluster.builder().addContactPoints("127.0.0.1").withCredentials("username", "password").build(); Session session = cluster.connect("tests")) {
    session.execute("INSERT INTO test_trans(tran_date , id ) VALUES ('2016-12-19','TMP')");

    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    dateFormat.setTimeZone(TimeZone.getTimeZone("GMT+6"));
    Date date = dateFormat.parse("2016-12-19");
    System.out.println(date);
    for (Row row : session.execute(QueryBuilder.select().from("timestamp_test").where(QueryBuilder.eq("tran_date", date)))) {
        System.out.println(row);
    }
}

Источник: https://docs.datastax.com/en/cql/3.0/cql/cql_reference/timestamp_type_r.html

Другие вопросы по тегам