Versione breve: è possibile interrogare tutte le colonne timeuuid corrispondenti ad una data particolare?Selezione delle colonne timeuuid corrispondenti a una data specifica
Maggiori dettagli:
Ho una tabella definita come segue:
CREATE TABLE timetest(
key uuid,
activation_time timeuuid,
value text,
PRIMARY KEY(key,activation_time)
);
ho popolato questo con una singola riga, come segue (f0532ef0-2a15-11e3-b292-51843b245f21
è un timeuuid corrispondente alla data 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');
E posso interrogare per quella riga come segue:
select activation_time,dateof(activation_time) from timetest where key=7daecb80-29b0-11e3-92ec-e291eb9d325e
che si traduce nel seguente (usando cqlsh)
activation_time | dateof(activation_time)
--------------------------------------+--------------------------
f0532ef0-2a15-11e3-b292-51843b245f21 | 2013-09-30 22:19:06+0100
Ora lascia supporre che c'è un sacco di dati in mio tavolo e voglio recuperare tutte le righe in cui activation_time
corrisponde a una data particolare, dicono 2013-09-30 22:19:06+0100
.
mi sarei aspettato di essere in grado di interrogare per la gamma di tutte le timeuuids tra minTimeuuid('2013-09-30 22:19:06+0100')
e maxTimeuuid('2013-09-30 22:19:06+0100')
ma questo non sembra possibile (la query seguente restituisce zero righe):
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');
Sembra che ho bisogno per usare un hack per cui ho incrementare la seconda data a mia domanda (per un secondo) per catturare il row (s), vale a dire,
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');
Questo si sente male. Mi sto perdendo qualcosa? C'è un modo più pulito per fare questo?
La documentazione CQL discute timeuuid functions ma è piuttosto a corto di gte espressioni/LTE con timeuuids, al di là:
Il/esempio maxTimeuuid min seleziona tutte le righe in cui la colonna timeuuid, t, è rigorosamente entro il 2013- 01-01 00: 05 + 0000 ma rigorosamente prima del 2013-02-02 10: 00 + 0000. Il t> = maxTimeuuid ('2013-01-01 00: 05 + 0000') non seleziona un timeuuid generato esattamente al 2013-01-01 00: 05 + 0000 ed è essenzialmente equivalente a t> maxTimeuuid ('2013-01 -01 00: 05 + 0000 ').
p.s. la seguente query restituisce anche zero righe:
select * from timetest where key=7daecb80-29b0-11e3-92ec-e291eb9d325e and activation_time<=maxTimeuuid('2013-09-30 22:19:06+0100');
e la seguente query restituisce la riga (s):
select * from timetest where key=7daecb80-29b0-11e3-92ec-e291eb9d325e and activation_time>minTimeuuid('2013-09-30 22:19:06+0100');
eccezionale! Grazie mille!!! Questo è esattamente. Purtroppo non è possibile passare le date con millisecondi in minTimeuuid o maxTimeuuid ... ma questo è un altro problema ... Se calcoli i timeuuids min/max e li passo nella query, funziona bene, ad es. 'selezionare * dal momento in cui key = 7daecb80-29b0-11e3-92ec-e291eb9d325e e activation_time> f0532ef0-2a15-11e3-8080-808080808080 e activation_time
lorcan
FYI: Ho effettuato l'accesso problema [CASSANDRA-6395] (https://issues.apache.org/jira/browse/CASSANDRA-6395) su apache jira per abilitare query con accuratezza al millisecondo. Grazie @Dimas, non avrei mai notato questo problema senza il tuo aiuto :-) – lorcan
Contento di poterti aiutare :) – dimas