2013-09-30 13 views
7

Krótka wersja: Czy można wyszukiwać wszystkie kolumny czasowe odpowiadające konkretnej dacie?Wybieranie kolumn timeuuid odpowiadających konkretnej dacie

Więcej szczegółów:

I Tabela zdefiniowana w następujący sposób:

CREATE TABLE timetest(
    key uuid, 
    activation_time timeuuid, 
    value text, 
    PRIMARY KEY(key,activation_time) 
); 

I wypełniane tym z jednego rzędu w następujący sposób (f0532ef0-2a15-11e3-b292-51843b245f21 jest timeuuid odpowiadający dacie 2013-09-30 22:19:06+0100)

insert into timetest (key, activation_time, value) VALUES (7daecb80-29b0-11e3-92ec-e291eb9d325e, f0532ef0-2a15-11e3-b292-51843b245f21, 'some value'); 

a mogę zapytać o tego rzędu, co następuje:

select activation_time,dateof(activation_time) from timetest where key=7daecb80-29b0-11e3-92ec-e291eb9d325e 

co skutkuje następującym (używając cqlsh)

activation_time      | dateof(activation_time) 
--------------------------------------+-------------------------- 
f0532ef0-2a15-11e3-b292-51843b245f21 | 2013-09-30 22:19:06+0100 

Teraz pozwala założyć, istnieje wiele danych w moim stole i chcę, aby pobrać wszystkie wiersze gdzie activation_time odpowiada określonym dniu, powiedzmy 2013-09-30 22:19:06+0100.

bym oczekiwać, aby móc zapytać o zakresie wszystkich timeuuids między minTimeuuid('2013-09-30 22:19:06+0100') i maxTimeuuid('2013-09-30 22:19:06+0100') ale to nie wydaje się możliwe (poniższa kwerenda zwraca zero wierszy):

select * from timetest where key=7daecb80-29b0-11e3-92ec-e291eb9d325e and activation_time>minTimeuuid('2013-09-30 22:19:06+0100') and activation_time<=maxTimeuuid('2013-09-30 22:19:06+0100'); 

Wydaje muszę używać hack czym ja przyrost drugi dzień w moim zapytaniu (przez drugi), aby złapać wiersz (y), czyli

select * from timetest where key=7daecb80-29b0-11e3-92ec-e291eb9d325e and activation_time>minTimeuuid('2013-09-30 22:19:06+0100') and activation_time<=maxTimeuuid('2013-09-30 22:19:07+0100'); 

Ten czuje się źle. Czy czegoś brakuje? Czy istnieje lepszy sposób na zrobienie tego?

Dokumentacja CQL omawia timeuuid functions ale to dość krótki na GTE wyrażeń/LTE z timeuuids, poza:

Min/maxTimeuuid przykład wybiera wszystkie wiersze, gdzie kolumna timeuuid, t, jest ściśle później niż 2013- 01-01 00: 05 + 0000, ale ściśle wcześniej niż w dniu 2013-02-02 10: 00 + 0000. The t> = maxTimeuuid ('2013-01-01 00: 05 + 0000') nie wybiera czasu wygenerowanego dokładnie na 2013-01-01 00: 05 + 0000 i jest zasadniczo równoważny t> maxTimeuuid ('2013-01 -01 00: 05 + 0000 ').

p.s. Następująca kwerenda zwraca również zerowe rzędów:

select * from timetest where key=7daecb80-29b0-11e3-92ec-e291eb9d325e and activation_time<=maxTimeuuid('2013-09-30 22:19:06+0100'); 

i poniższa kwerenda zwraca wiersz (s):

select * from timetest where key=7daecb80-29b0-11e3-92ec-e291eb9d325e and activation_time>minTimeuuid('2013-09-30 22:19:06+0100'); 

Odpowiedz

8

Jestem pewien, że problemem jest to, że cqlsh nie wyświetla milisekund dla znaczników czasu Prawdziwy znacznik czasu to coś takiego jak "2013-09-30 22: 19: 06.123 + 0100" Gdy wywołujemy maxTimeuuid ("2013-09-30 22: 19: 06 + 0100"), gdy brakuje milisekund, przyjmuje się zero więc jest to to samo co wywołanie maxTimeuuid ('2013-09-30 22: 19: 06.000 + 0100')

A jako 22: 19: 06.123> 22: 19: 06.000, który powoduje odfiltrowanie rekordu.

+0

wybitny! Dziękuję bardzo!!! Właśnie to. Niestety, nie możesz przekazywać dat z milisekundami do minTimeuuid lub maxTimeuuid ... ale to kolejny problem ... Jeśli obliczysz min/max timeuuids i przekażę je do zapytania, działa to na przykład 'select * from timetest gdzie key = 7daecb80-29b0-11e3-92ec-e291eb9d325e i activation_time> f0532ef0-2a15-11e3-8080-808080808080 i activation_time lorcan

+0

FYI: Zalogowałem się wydać [CASSANDRA-6395] (https://issues.apache.org/jira/browse/CASSANDRA-6395) na apache jira, aby włączyć milisekundowe zapytania o dokładność. Dzięki @dimas, nigdy nie zauważylibyśmy tego problemu bez twojej pomocy :-) – lorcan

+0

Cieszę się, że mogłem pomóc :) – dimas

0

Nie jest bezpośrednio związane z odpowiedzią, ale jako dodatkowy dodatek do odpowiedzi @dimas.
cqlsh (wersja 5.0.1) wydają się pokazać milisekundy teraz

system.dateof(id) 
--------------------------------- 
2016-06-03 02:42:09.990000+0000 
2016-05-28 17:07:30.244000+0000 
Powiązane problemy