在cassandra cql select中获取当前日期

14ifxucb  于 2022-12-18  发布在  Cassandra
关注(0)|答案(2)|浏览(167)

在SQL中,我能够:

select getdate(), getdate() - 7

它返回当前日期以及当前日期- 7天。我想在Cassandra CQL中实现相同。我尝试了:

select dateof(now())

但是那不起作用。它只在插入时起作用,在选择时不起作用。我怎么能得到同样的效果呢?任何帮助都将不胜感激。

rqmkfv5c

rqmkfv5c1#

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不支持算术运算,更不用说日期运算了,所以从这个值中减去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中使用。

ct3nt3jp

ct3nt3jp2#

另一种可能的解决方案可以用于您具有读访问权限的任何表,而不管它是只有一行、多行还是根本没有:

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

这里的不同之处在于聚合函数COUNT(*)保证结果集始终只包含一行。
显然,用一个你有读访问权限的表替换any_table,用完全指定表分区键的内容替换WHERE子句,同样,不需要有任何实际的行与分区键的指定值匹配,所以任何正确类型的值都可以硬编码。

更新

如果表有很多行,那么count(*)将花费很长时间来完成,甚至可能超时,因此使用此方法时要谨慎。

在一旁

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

相关问题