cassandra 如何在CQL时间戳列上筛选特定日期?

pzfprimi  于 2022-12-12  发布在  Cassandra
关注(0)|答案(1)|浏览(272)

我将表定义为:

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”数据?

5kgi1eie

5kgi1eie1#

您不需要使用TODATE()函数来筛选特定日期。在对CQL timestamp列应用筛选器时,只需将日期指定为'2022-12-11'即可。
但不同之处在于,您不能使用相等运算符(=),因为CQL timestamp数据类型被编码为自Unix纪元(1970年1月1日00:00 GMT)以来的毫秒数,因此在使用时间戳时需要精确。
让我使用此示例表进行说明:

CREATE TABLE tstamps (
    id int,
    tstamp timestamp,
    colour text,
    PRIMARY KEY (id, tstamp)
)

我的数据表包含下列范例数据:

cqlsh> SELECT * FROM tstamps ;

 id | tstamp                          | colour
----+---------------------------------+--------
  1 | 2022-12-05 11:25:01.000000+0000 |    red
  1 | 2022-12-06 02:45:04.564000+0000 | yellow
  1 | 2022-12-06 11:06:48.119000+0000 | orange
  1 | 2022-12-06 19:02:52.192000+0000 |  green
  1 | 2022-12-07 01:48:07.870000+0000 |   blue
  1 | 2022-12-07 03:13:27.313000+0000 | indigo

cqlshi客户机将tstamp列格式化为UTC格式的可读日期,但实际上,tstamp值存储为整数:

cqlsh> SELECT tstamp, TOUNIXTIMESTAMP(tstamp) FROM tstamps ;

 tstamp                          | system.tounixtimestamp(tstamp)
---------------------------------+--------------------------------
 2022-12-05 11:25:01.000000+0000 |                  1670239501000
 2022-12-06 02:45:04.564000+0000 |                  1670294704564
 2022-12-06 11:06:48.119000+0000 |                  1670324808119
 2022-12-06 19:02:52.192000+0000 |                  1670353372192
 2022-12-07 01:48:07.870000+0000 |                  1670377687870
 2022-12-07 03:13:27.313000+0000 |                  1670382807313

若要撷取特定日期的数据列,您必须指定落在特定日期的时间戳记范围。例如,2022年12月6日UTC的时间戳记范围从16702848000002022-12-06 00:00:00.000 UTC)到16703711999992022-12-06 23:59:59.999 UTC)。
这意味着如果我们想查询12月6日,我们需要使用范围查询进行筛选:

SELECT * FROM tstamps \
  WHERE id = 1 \
  AND tstamp >= '2022-12-06' \
  AND tstamp < '2022-12-07';

我们得到:

id | tstamp                          | colour
----+---------------------------------+--------
  1 | 2022-12-06 02:45:04.564000+0000 | yellow
  1 | 2022-12-06 11:06:48.119000+0000 | orange
  1 | 2022-12-06 19:02:52.192000+0000 |  green

警告-在timestamp列是分区键的一部分的情况下,执行范围查询是危险的,因为它会导致多分区查询--16702848000001670371199999之间有86 M个可能的值。因此,时间戳不是分区键的好选择。干杯!

👉 请将鼠标悬停在上面的cassandra标记上并单击Watch标记,以支持Apache Cassandra社区。🙏谢谢!

相关问题