2017-12-20 3 views
1

Wie kann ich nur einen Teil des aktuellen Datums in Cassandra bekommen? In meinem speziellen Fall muss ich nur das Jahr bekommen.Wie bekomme ich das aktuelle Jahr auf Cassandra

ich im Moment dazu bekam select dateof(now()) from system.local;

Aber ich konnte jede Funktion nur das Jahr, in der Dokumentation https://docs.datastax.com/en/dse/5.1/cql/cql/cql_reference/refCqlFunction.html#refCqlFunction__toTimestamp

Ich bin neu mit Cassandra nicht finden, um so diese vielleicht eine dumme Frage.

Antwort

3

Die sichere Weise, wäre, einen Zeitstempel zurückzugeben und das Jahr clientseitig auszugruppieren.

Nativ hat Cassandra keine Funktionen, die dabei helfen können. Sie können jedoch eine benutzerdefinierte Funktion (UDF) schreiben, um dies zu erreichen:

Zuerst sind benutzerdefinierte Funktionen standardmäßig deaktiviert. Sie müssen diese Einstellung in Ihrer cassandra.yaml anpassen und Ihre Knoten neu starten.

enable_user_defined_functions=true 

HINWEIS: Diese Einstellung wird auf diese Weise aus einem Grund Verzug geraten. Obwohl Cassandra 3.x einige Sicherheitsvorkehrungen zum Schutz vor bösartigem Code enthält, ist es ratsam, diese Option deaktiviert zu lassen, es sei denn, Sie benötigen beides und Sie wissen, was Sie tun. Und selbst dann sollten Sie UDFs im Auge behalten, die definiert werden.

Jetzt werde ich meine Funktion erstellen Java verwenden, aus cqlsh:

[email protected]:stackoverflow> CREATE OR REPLACE FUNCTION year (input DATE) 
RETURNS NULL ON NULL INPUT RETURNS TEXT 
LANGUAGE java AS 'return input.toString().substring(0,4);'; 

Beachten Sie, dass es eine Reihe von Möglichkeiten (und Typen) die aktuelle Datum/Uhrzeit abfragen:

[email protected]:stackoverflow> SELECT todate(now()) as date, 
    totimestamp(now()) as timestamp, now() as timeuuid FROm system.local; 

date  | timestamp      | timeuuid 
------------+---------------------------------+------------------------------------- 
2017-12-20 | 2017-12-20 21:18:37.708000+0000 | 58167cc1-e5cb-11e7-9765-a98c427e8248 

(1 rows) 

Um nur nur für Jahr wieder, ich kann meine year Funktion auf den todate(now()) Spalt nennen:

SELECT stackoverflow.year(todate(now())) as year FROm system.local; 

year 
------ 
2017 

(1 rows) 
Verwandte Themen