2017-09-09 49 views
3

我的目標,是去除的固定時間內,從現在開始()。所以,我總是最後五分鐘,或過去五小時。如何做日期時間算術在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; 

回答

1

算術運算符4.0

  • 添加算術運算符(CASSANDRA-11935)

來源支持:https://github.com/apache/cassandra/blob/trunk/CHANGES.txt#L124


編輯

如果你的卡珊德拉版本低於4.0,那麼你必須從應用層做,或創建一個用戶定義函數(UDF)。檢查以下鏈接

Creating user-defined function in Cassandra

+0

加油!他們至少可以指定「最新」也意味着「不穩定」,以及哪部分是穩定的或不... 謝謝你,我更新我的問題,使它更有建設性。 – Micka

+0

@Micka查看更新的答案 –

+1

太棒了!謝謝! – Micka