我将表定义为:
CREATE TABLE downtime(
asset_code text,
down_start timestamp,
down_end timestamp,
down_duration duration,
down_type text,
down_reason text,
PRIMARY KEY ((asset_code, down_start), down_end)
);
我希望在特定日期获得停机时间,例如:
SELECT * FROM downtime \
WHERE asset_code = 'CA-PU-03-LB' \
AND todate(down_start) = '2022-12-11';
出现语法错误:
SyntaxException: line 1:66 no viable alternative at input '(' (...where asset_code = 'CA-PU-03-LB' and [todate](...)
如果where子句中的分区键上不允许函数,我如何才能获得特定日期的“down_start”数据?
1条答案
按热度按时间5kgi1eie1#
您不需要使用
TODATE()
函数来筛选特定日期。在对CQLtimestamp
列应用筛选器时,只需将日期指定为'2022-12-11'
即可。但不同之处在于,您不能使用相等运算符(
=
),因为CQLtimestamp
数据类型被编码为自Unix纪元(1970年1月1日00:00 GMT)以来的毫秒数,因此在使用时间戳时需要精确。让我使用此示例表进行说明:
我的数据表包含下列范例数据:
cqlshi客户机将
tstamp
列格式化为UTC格式的可读日期,但实际上,tstamp
值存储为整数:若要撷取特定日期的数据列,您必须指定落在特定日期的时间戳记范围。例如,2022年12月6日UTC的时间戳记范围从
1670284800000
(2022-12-06 00:00:00.000 UTC
)到1670371199999
(2022-12-06 23:59:59.999 UTC
)。这意味着如果我们想查询12月6日,我们需要使用范围查询进行筛选:
我们得到:
警告-在
timestamp
列是分区键的一部分的情况下,执行范围查询是危险的,因为它会导致多分区查询--1670284800000
和1670371199999
之间有86 M个可能的值。因此,时间戳不是分区键的好选择。干杯!👉 请将鼠标悬停在上面的
cassandra
标记上并单击Watch标记,以支持Apache Cassandra社区。🙏谢谢!