2013-09-30 5 views
7

Kurzversion: Ist es möglich, alle Zeitspalten zu einem bestimmten Datum abzufragen?Auswählen von Zeitspalten, die einem bestimmten Datum entsprechen

Weitere Einzelheiten:

Ich habe eine Tabelle wie folgt definiert:

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

I dies mit einer einzigen Reihe aufgefüllt sind, wie folgt (f0532ef0-2a15-11e3-b292-51843b245f21 ist ein timeuuid dem Datum entsprechenden 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'); 

Und ich kann für diese Zeile wie folgt abfragen:

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

, die in dem folgenden (mit cqlsh) führen

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

kann nun davon ausgehen, eine Menge Daten in meinem Tisch gibt es, und ich möchte alle Zeilen abzurufen, wo activation_time zu einem bestimmten Datum entspricht, sagen 2013-09-30 22:19:06+0100.

ich hätte anknüpfen können für den Bereich aller timeuuids zwischen minTimeuuid('2013-09-30 22:19:06+0100') und maxTimeuuid('2013-09-30 22:19:06+0100') abzufragen, aber dies nicht möglich erscheint (die folgende Abfrage gibt null Zeilen):

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

Es scheint, ich brauche die Zeile (n), dh einen Hack zu verwenden, wobei ich das zweite Datum in meiner Anfrage (nach einer Sekunde) erhöht zu fangen

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

das fühlt sich falsch. Fehle ich etwas? Gibt es einen saubereren Weg, dies zu tun?

Die CQL Dokumentation diskutiert timeuuid functions aber es ist ziemlich kurz auf gte/lte Ausdrücke mit timeuuids, darüber hinaus:

Die min/maxTimeuuid Beispiel wählt alle Zeilen, in denen die timeuuid Spalte, t, streng später ist als 2013- 01-01 00: 05 + 0000 aber streng früher als 2013-02-02 10: 00 + 0000. Das t> = maxTimeuuid ('2013-01-01 00: 05 + 0000') wählt kein genau zum 01.01.2013 00: 05 + 0000 erzeugtes Zeitdiagramm aus und entspricht im Wesentlichen t> maxTimeeuuid ('2013-01 -01 00: 05 + 0000 ').

p.s. die folgende Abfrage gibt auch keine Zeilen:

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

und die folgende Abfrage gibt die Zeile (n):

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

Antwort

8

Ich bin sicher, dass das Problem, dass cqlsh ist Millisekunden nicht angezeigt für Ihre Zeitstempel Also ist der echte Zeitstempel etwas wie '2013-09-30 22: 19: 06.123 + 0100' Wenn Sie maxTimeuuid ('2013-09-30 22: 19: 06 + 0100') aufrufen, während Millisekunden fehlen, wird Null angenommen also ist es das gleiche wie das Aufrufen von maxTimeuuid ('2013-09-30 22: 19: 06.000 + 0100')

Und als 22: 19: 06.123> 22: 19: 06.000, dass die Aufzeichnung herausgefiltert wird.

+0

Outstanding zu zeigen! Ich danke dir sehr!!! Das ist es genau. Leider können Sie keine Daten mit Millisekunden in minTimeuuid oder maxTimeuuid übergeben ... aber das ist ein anderes Problem ... Wenn ich die min/max timeuuids berechne und sie in die Abfrage übergebe, funktioniert es ein Vergnügen, z. 'select * from timestest wobei key = 7daec80-29b0-11e3-92ec-e291eb9d325e und activation_time> f0532ef0-2a15-11e3-8080-808080808080 und activation_time lorcan

+0

FYI: Ich habe mich eingeloggt Geben Sie [CASSANDRA-6395] (https://issues.apache.org/jira/browse/CASSANDRA-6395) auf dem Apache Jira ein, um Millisekunden-Genauigkeitsabfragen zu ermöglichen. Danke @dimas, hätte dieses Problem nie ohne Ihre Hilfe entdeckt :-) – lorcan

+0

Froh, dass ich helfen könnte :) – dimas

0

Nicht direkt im Zusammenhang mit der Antwort, sondern als zusätzliches Addon zu @dimas answer.
cqlsh (Version 5.0.1) scheint den miliseconds jetzt

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