在 cassandra cql select 中获取当前日期

Get current date in cassandra cql select

在SQL,我可以做到:

select getdate(), getdate() - 7

其中 returns 当前日期以及当前日期 - 7 天。我想在 Cassandra CQL 中实现同样的目标。我试过了:

select dateof(now())

但这不起作用。它仅适用于插入而不适用于 select。我怎样才能得到相同的?任何帮助将不胜感激。

select dateof(now())

就其本身而言,你是对的,这是行不通的。但是如果你有一个你知道只有一行的 table(比如 system.local):

aploetz@cqlsh:Whosebug> SELECT dateof(now()) FROM system.local ;

 dateof(now())
--------------------------
 2015-03-26 03:18:39-0500

(1 rows)

不幸的是,Cassandra CQL(还没有?CASSANDRA-5505)包括对算术运算的支持,更不用说日期算术了。因此,从该值中减去 7 天是您在应用程序级别必须执行的操作。

编辑 20200422

较新的语法改为使用 toTimestamp() 函数:

aploetz@cqlsh> SELECT toTimestamp(now()) FROM system.local;

 system.totimestamp(system.now())
----------------------------------
  2020-04-22 13:22:04.752000+0000

(1 rows)

从 20200422 开始,这两种语法都有效。

另一种可能的解决方案适用于您具有读取权限的任何 table,无论它是否只有一行、多行,甚至 none:

SELECT toTimestamp(now()) AS now, count(*) FROM any_table WHERE partition_key=xyz;

这里的区别在于聚合函数COUNT(*)保证结果集总是恰好包含一行。

显然,将 any_table 替换为您具有读取权限的 table,并将 WHERE 子句替换为完全指定 table 分区键的内容。同样,不需要任何实际行与分区键的指定值匹配,因此可以对正确类型的任何值进行硬编码。

一边

dateof() 在 Cassandra 2.2.0-rc2 中被弃用。对于更高版本,您应该将其使用替换为 toTimestamp().