2017-09-09 13 views
3

내 목표는 지금부터 일정한 시간을 제거하는 것입니다. 그래서 나는 항상 마지막 5 분, 또는 마지막 5 시간을 얻는다.CQL에서 datetimes를 사용하여 산술을 수행하는 방법

어떻게하면됩니까? 카산드라에

The documentation는 말한다 :

기간이 (+)를 추가하거나 substracted 할 수 있습니다 - 타임 스탬프 또는 새로운 타임 스탬프 또는 날짜를 제작하는 일로부터(). 예를 들어 그래서 :
SELECT * FROM myTable WHERE t = '2017-01-01' - 2d
cqlsh 내부 2016

의 마지막 2 일 내에입니다 t의 값을 모든 레코드를 선택합니다 show version; 저를 제공합니다

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

I을 다음 표를 사용하여 테스트 :

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

  • 하는 산술 연산자 (카산드라-11935)

소스에 대한 지원 추가 : https://github.com/apache/cassandra/blob/trunk/CHANGES.txt#L124

을 편집

당신의 카산드라 버전보다 4.0 다음 ​​(UDF)를 응용 프로그램 계층에서 수행하거나 사용자가 함수를 정의 만들어야 할 경우 0


. 아래 링크를 확인하십시오

Creating user-defined function in Cassandra

+0

어서 오세요! 그들은 적어도 "최신"이라는 말은 "불안정"을 의미 할뿐만 아니라 어느 부분이 안정적인지 아닌지를 나타낼 수 있습니다 ... 감사합니다. 제 질문을 업데이트하여 좀 더 건설적으로 만드십시오. – Micka

+0

@Micka 업데이트 된 답변 확인 –

+1

굉장! 고맙습니다! – Micka