在 cassandra cql select 中获取当前日期

问题描述 投票:0回答:3

在 SQL 中,我能够做到:

select getdate(), getdate() - 7

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

select dateof(now())

但这不起作用。它仅适用于插入,不适用于选择。我怎样才能得到同样的东西?任何帮助将不胜感激。

cassandra cql cql3
3个回答
42
投票
select dateof(now())

就其本身而言,你是对的,那是行不通的。但是,如果您知道一张表格只有一行(例如

system.local
):

aploetz@cqlsh:stackoverflow> 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 起均有效。


0
投票

另一种可能的解决方案适用于您具有读取访问权限的任何表,无论它是否有一行、多行,甚至根本没有:

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

此处的区别在于,聚合函数

COUNT(*)
保证结果集始终只包含一行。

显然,将

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

更新

如果表有很多行,那么

count(*)
将需要很长时间才能完成,甚至可能会超时,因此请谨慎使用此方法。

旁白

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


0
投票

来自这些文档:https://docs.datastax.com/en/cql/dse/docs/developing/inserting/upsert-date.html

你必须使用这个:

toDate(now())

© www.soinside.com 2019 - 2024. All rights reserved.