2017-09-09 5 views
3

Mon objectif est de supprimer une durée fixe, à partir de maintenant(). Donc, je reçois toujours les cinq dernières minutes, ou les cinq dernières heures.comment faire de l'arithmétique avec datetime en CQL

Comment puis-je l'obtenir?

The documentation sur dit cassandra:

Une durée peut être ajouté (+) ou soustrait (-) à partir d'un horodatage ou une date pour créer une nouvelle horodatage ou la date. Ainsi, par exemple:
SELECT * FROM myTable WHERE t = '2017-01-01' - 2d
sélectionnera tous les enregistrements d'une valeur de t qui est dans les 2 derniers jours de 2016.

intérieur cqlsh, show version; me donne:

[cqlsh 5.0.1 | Cassandra 3.11.0 | CQL spec 3.4.4 | Native protocol v4] 

I test avec le tableau suivant:

cqlsh:> CREATE TABLE t (
    ... ts  timestamp, 
    ... PRIMARY KEY (ts) 
    ...) 
    ... WITH compression = {'class': 'LZ4Compressor'} 
    ... AND gc_grace_seconds = 60; 

La suite rès fonctionne:

SELECT (float)1.55 FROM t WHERE (ts <= toTimestamp(now())); 

Les suivants ne le font pas:

cqlsh:> SELECT (float)1.55 FROM t WHERE (ts <= toTimestamp(now() - 1d)); 
SyntaxException: line 1:57 mismatched input '-' expecting ')' (...ts <= toTimestamp(now() [-]...) 
cqlsh:> SELECT (float)1.55 FROM t WHERE (ts <= toTimestamp(now()) - 1d); 
SyntaxException: line 1:58 mismatched input '-' expecting ')' (... <= toTimestamp(now()) [-]...) 
cqlsh:> SELECT (float)1.55 FROM t WHERE (ts <= toTimestamp(now()) - 1m); 
SyntaxException: line 1:58 mismatched input '-' expecting ')' (... <= toTimestamp(now()) [-]...) 
cqlsh:> SELECT (float)1.55 FROM t WHERE ts <= toTimestamp(now()) - 1m; 
SyntaxException: line 1:57 mismatched input '-' expecting EOF (... <= toTimestamp(now()) [-]...) 
cqlsh:> SELECT (float)1.55 FROM t WHERE ts = toTimestamp(now()) - 1m; 
SyntaxException: line 1:56 mismatched input '-' expecting EOF (... = toTimestamp(now()) [-]...) 

Comme vous pouvez voir l'erreur est toujours sur le - en essayant de soustraire la durée. (Par ailleurs, le résultat est le même avec +)

Qu'est-ce que je fais mal? il pourrait y avoir un moyen de l'atteindre, mais je ne peux pas le comprendre!

solution

Pour mémoire, tel que suggéré par @ Ashraful-Islam ma solution a été de créer une UDF pour faire le travail. voir ci-dessous:

CREATE FUNCTION IF NOT EXISTS timeAgo(minutes int) 
    CALLED ON NULL INPUT 
    RETURNS timestamp 
    LANGUAGE java AS ' 
    long now = System.currentTimeMillis(); 
    if (minutes == null) 
     return new Date(now); 
    return new Date(now - (minutes.intValue() * 60 * 1000)); 
    '; 

-- So I can do 
SELECT timeAgo(60) FROM t; 

Répondre

1

Opérateurs arithmétiques introduits dans Cassandra 4,0

  • Ajout du support pour les opérateurs arithmétiques (CASSANDRA-11935)

Source: https://github.com/apache/cassandra/blob/trunk/CHANGES.txt#L124


Edité

Si votre version cassandra moins de 4,0, alors vous devez le faire à partir de la couche d'application ou créer une fonction utilisateur de définir (UDF). Vérifiez le lien ci-dessous

Creating user-defined function in Cassandra

+0

Venez! Ils pourraient au moins spécifier "dernier" signifie aussi "instable", ainsi que les parties qui sont stables ou non ... Merci, je mets à jour ma question pour la rendre plus constructive alors. – Micka

+0

@Micka Consultez la réponse mise à jour –

+1

Awesome! Je vous remercie! – Micka