在SQL中,我能够:
select getdate(), getdate() - 7
它返回当前日期以及当前日期- 7天。我想在Cassandra CQL中实现相同。我尝试了:
select dateof(now())
但是那不起作用。它只在插入时起作用,在选择时不起作用。我怎么能得到同样的效果呢?任何帮助都将不胜感激。
rqmkfv5c1#
就其本身而言,你是对的,这是行不通的,但是如果你知道一个表只有一行(比如system.local):
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()函数:
toTimestamp()
aploetz@cqlsh> SELECT toTimestamp(now()) FROM system.local; system.totimestamp(system.now()) ---------------------------------- 2020-04-22 13:22:04.752000+0000 (1 rows)
型这两种语法都可以在20200422中使用。
ct3nt3jp2#
另一种可能的解决方案可以用于您具有读访问权限的任何表,而不管它是只有一行、多行还是根本没有:
SELECT toTimestamp(now()) AS now, count(*) FROM any_table WHERE partition_key=xyz;
这里的不同之处在于聚合函数COUNT(*)保证结果集始终只包含一行。显然,用一个你有读访问权限的表替换any_table,用完全指定表分区键的内容替换WHERE子句,同样,不需要有任何实际的行与分区键的指定值匹配,所以任何正确类型的值都可以硬编码。
COUNT(*)
any_table
更新
如果表有很多行,那么count(*)将花费很长时间来完成,甚至可能超时,因此使用此方法时要谨慎。
count(*)
在一旁
dateof()在Cassandra 2.2.0-rc 2中已弃用。对于更高版本,应将其替换为toTimestamp()。
dateof()
2条答案
按热度按时间rqmkfv5c1#
就其本身而言,你是对的,这是行不通的,但是如果你知道一个表只有一行(比如
system.local
):不幸的是,Cassandra CQL不支持算术运算,更不用说日期运算了,所以从这个值中减去7天是你必须在应用程序级别做的事情。
编辑20200422
较新的语法改为使用
toTimestamp()
函数:型
这两种语法都可以在20200422中使用。
ct3nt3jp2#
另一种可能的解决方案可以用于您具有读访问权限的任何表,而不管它是只有一行、多行还是根本没有:
这里的不同之处在于聚合函数
COUNT(*)
保证结果集始终只包含一行。显然,用一个你有读访问权限的表替换
any_table
,用完全指定表分区键的内容替换WHERE子句,同样,不需要有任何实际的行与分区键的指定值匹配,所以任何正确类型的值都可以硬编码。更新
如果表有很多行,那么
count(*)
将花费很长时间来完成,甚至可能超时,因此使用此方法时要谨慎。在一旁
dateof()
在Cassandra 2.2.0-rc 2中已弃用。对于更高版本,应将其替换为toTimestamp()
。