我的目標,是去除的固定時間內,從現在開始()。所以,我總是最後五分鐘,或過去五小時。如何做日期時間算術在CQL
我怎樣才能實現呢?
The documentation上卡桑德拉說:
的持續時間可以被添加(+)或中減去 - 從時間戳或 日期創建一個新的時間戳或日期()。因此,例如:
SELECT * FROM myTable WHERE t = '2017-01-01' - 2d
將選擇所有與T的值,它是在2016年
內cqlsh
最後2天的記錄,show version;
給我:
[cqlsh 5.0.1 | Cassandra 3.11.0 | CQL spec 3.4.4 | Native protocol v4]
我用下表測試:
cqlsh:> CREATE TABLE t (
... ts timestamp,
... PRIMARY KEY (ts)
...)
... WITH compression = {'class': 'LZ4Compressor'}
... AND gc_grace_seconds = 60;
下面的曲線ERY工作:
SELECT (float)1.55 FROM t WHERE (ts <= toTimestamp(now()));
將以下別:
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()) [-]...)
正如你所看到的錯誤始終是關於-
努力的。減去持續時間時。 (順便說一下,結果與+
相同)
我該怎麼做?有可能是一個方法去實現它,但我不能看着辦吧!
解決方案
爲了記錄在案,由@ Ashraful伊斯蘭建議我的解決方案是創建一個UDF來完成這項工作。請看下圖:在卡桑德拉介紹
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;
加油!他們至少可以指定「最新」也意味着「不穩定」,以及哪部分是穩定的或不... 謝謝你,我更新我的問題,使它更有建設性。 – Micka
@Micka查看更新的答案 –
太棒了!謝謝! – Micka