2016-01-22 2 views
4

Я создал таблицу следующим образом в Кассандре:Cassandra запрос с равным оператором на колонке метки времени не работает

CREATE TABLE sp.status(
ams text, 
load_start_time timestamp, 
file_path text, 
file_timestamp timestamp, 
host text, 
load_end_time timestamp, 
records_ignored int, 
records_imported int, 
records_in_file int, 
status text, 
PRIMARY KEY (ams, load_start_time) 
) WITH CLUSTERING ORDER BY (load_start_time DESC) 

Я хочу, чтобы выбрать строку с определенной датой. Когда я использую оператор>, все работает так, как ожидалось. Но если я использую оператор =, я не получаю никаких данных.

SELECT * FROM sp.status WHERE ams = 'RRG' AND load_start_time='2016-01-20 10:10:27' allow filtering; 

Существует в базе данных строка с этим значением для load_start_time и возвращается, если в приведенном выше запросе я заменяю = с> для load_start_time.

Может кто-нибудь объяснить, почему это так?

Мне действительно нужно это для оператора DELETE, и там я не могу использовать операторы диапазона, only =.

ответ

5

Вы ВСТАВЛЯЛИ строки, используя dateOf(now()), или другим методом, содержащим миллисекундную точность? TIMESTAMPs будет хранить миллисекунды, но будет не отображать его. Проверьте этот пример:

CREATE TABLE stackoverflow.timestamptest (
    userid text, 
    activetime timestamp, 
    value text, 
    PRIMARY KEY (userid, activetime) 
) WITH CLUSTERING ORDER BY (activetime ASC) 


INSERT INTO timestamptest (userid,activetime,value) VALUES ('d',dateof(now()),'value1'); 
INSERT INTO timestamptest (userid,activetime,value) VALUES ('d','2016-01-22 14:57:54+0000','value2'); 
SELECT userid, value, activetime, blobAsBigint(timestampAsBlob(activetime)) 
    FROM timestamptest WHERE userid='d'; 


userid | value | activetime    | system.blobasbigint(system.timestampasblob(activetime)) 
--------+--------+--------------------------+--------------------------------------------------------- 
     d | value2 | 2016-01-22 14:57:54+0000 |       1453474674000 
     d | value1 | 2016-01-22 14:57:54+0000 |       1453474674912 

(2 rows) 

оберточного activetime в blobAsBigint(timestampAsBlob()) вложенных функциях, я могу видеть, что есть миллисекунды, присутствующие в течение времени, введенное через dateOf(now()) (912), но не для времени, введенного в виде текста. Как вы узнаете, это может стать проблематичным, когда вам нужно выполнить обновление на месте или удалить его.

Попробуйте использовать blobAsBigint(timestampAsBlob()), чтобы узнать, существуют ли миллисекунды, а затем добавьте эти миллисекунды к значению метки времени для операции DELETE. например:

DELETE FROM timestamptest WHERE userid='d' AND activetime='2016-01-22 14:57:54.912+0000'; 
+0

Вы правы. Я также думал, что миллисекунды были проблемой при запуске. Я использую Dbeaver для доступа к Cassandra. Я проверил свое поле timestamp, и он не показал никаких признаков того, что он хранит миллисекунды. Но ваш метод показал, что он делает, как вы сказали. Я добавил ms, и это сработало. Спасибо – dragosb

+0

@dragosb Удивительный! Рад, что смог помочь. – Aaron

0

Держу пари, что это вызвано различными часовыми поясами. Попытайтесь включить свою зону в отчет, как ...AND load_start_time='2016-01-20 10:10:27.000+0200'

+0

Я думал об этом, но я тестировал с> оператором на втором уровне, так что я точно знаю, что дата верна для ввода – dragosb

 Смежные вопросы

  • Нет связанных вопросов^_^