2013-09-30 9 views
7

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'); 

risposta

8

Sono sicuro che il problema è che cqlsh non visualizza millisecondi per le timestamp Quindi il timestamp reale è qualcosa del tipo '2013-09-30 22: 19: 06.123 + 0100' Quando si chiama maxTimeuuid ('2013-09-30 22: 19: 06 + 0100') man mano che mancano i millisecondi, viene assunto zero quindi equivale a chiamare maxTimeuuid ('2013-09-30 22: 19: 06.000 + 0100')

E come 22: 19: 06.123> 22: 19: 06.000 che fa filtrare il record.

+0

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

+0

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

+0

Contento di poterti aiutare :) – dimas

0

Non direttamente correlato alla risposta ma come addon aggiuntivo alla risposta @dimas.
cqlsh (versione 5.0.1) sembrano mostrare i millisecondi ora

system.dateof(id) 
--------------------------------- 
2016-06-03 02:42:09.990000+0000 
2016-05-28 17:07:30.244000+0000 
Problemi correlati