Столбец метки времени запроса Кассандры
Использование 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