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');
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
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
Cieszę się, że mogłem pomóc :) – dimas