在 SQL 中,我能够做到:
select getdate(), getdate() - 7
返回当前日期以及当前日期 - 7 天。我想在 Cassandra CQL 中实现同样的目标。我试过:
select dateof(now())
但这不起作用。它仅适用于插入,不适用于选择。我怎样才能得到同样的东西?任何帮助将不胜感激。
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 起均有效。
另一种可能的解决方案适用于您具有读取访问权限的任何表,无论它是否有一行、多行,甚至根本没有:
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()
。
来自这些文档:https://docs.datastax.com/en/cql/dse/docs/developing/inserting/upsert-date.html
你必须使用这个:
toDate(now())