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;
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
@Micka Consultez la réponse mise à jour –
Awesome! Je vous remercie! – Micka