【问题标题】:how to do arithmetics with datetimes in CQL如何在 CQL 中使用日期时间进行算术运算
【发布时间】:2018-02-18 12:10:45
【问题描述】:

我的目标是从现在()开始删除固定的时间。所以我总是能得到最后五分钟,或者最后五个小时。

我怎样才能实现它?

The documentation on cassandra 说:

可以在时间戳或时间戳中添加 (+) 或减去 (-) 持续时间 date 创建新的时间戳或日期。例如:
SELECT * FROM myTable WHERE t = '2017-01-01' - 2d
将选择 2016 年最后 2 天的 t 值的所有记录。

cqlshshow 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;

以下查询有效:

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-Islam 所建议的,我的解决方案是创建一个 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;

【问题讨论】:

    标签: cassandra cql cql3 cqlsh cassandra-3.0


    【解决方案1】:

    Cassandra 4.0 中引入的算术运算符

    • 添加对算术运算符的支持 (CASSANDRA-11935)

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


    已编辑

    如果您的 cassandra 版本低于 4.0,那么您必须从应用程序层执行此操作或创建用户定义函数 (UDF)。检查以下链接

    Creating user-defined function in Cassandra

    【讨论】:

    • 加油!他们至少可以指定“最新”也意味着“不稳定”,以及哪些部分是稳定的……谢谢,我更新了我的问题,使其更具建设性。
    • 太棒了!谢谢!
    猜你喜欢
    • 2018-10-10
    • 2013-05-16
    • 2020-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    • 2021-05-26
    • 1970-01-01
    相关资源
    最近更新 更多