在Apache IoTDB的表模型中,WHERE子句里使用 `time` 字符串,为什么在TIMESTAMP = STRING的情况下会失败?
我在IoTDB的表模型中使用2.0.8版本。我有一个泵读数表,需要在一个严格的时间戳上取出对应的那一行。CLI显示的值看起来像ISO时间戳,因此我尝试在WHERE条件中使用同样的时间戳文本。
模式与测试数据:
CREATE TABLE pump_metric (
device_id STRING TAG,
line_id STRING TAG,
pressure DOUBLE FIELD
);
INSERT INTO pump_metric(`time`, device_id, line_id, pressure) VALUES (1000, 'P1', 'L1', 10.0);
INSERT INTO pump_metric(`time`, device_id, line_id, pressure) VALUES (2000, 'P1', 'L1', 12.0);
INSERT INTO pump_metric(`time`, device_id, line_id, pressure) VALUES (3000, 'P2', 'L2', 20.0);
失败的尝试:将 time 与看起来像时间戳的字符串进行比较:
SELECT `time`, device_id, line_id, pressure
FROM pump_metric
WHERE `time` = '1970-01-01 08:00:02.000';
错误信息:
Msg: org.apache.iotdb.jdbc.IoTDBSQLException: 701: Cannot apply operator: TIMESTAMP = STRING
该字符串在此表达式中不会被隐式转换为时间戳,即使它的格式与查询输出中显示的值相同。
我已经尝试过的办法:使用插入时的数值时间戳值
SELECT `time`, device_id, line_id, pressure
FROM pump_metric
WHERE `time` = 2000;
结果:
time |
device_id | line_id | pressure |
|---|---|---|---|
| 1970-01-01T08:00:02.000+08:00 | P1 | L1 | 12.0 |
这在某些场景下可以工作,但在我的应用中,用户输入通常以格式化的 time 字符串开头,而不是以纪元毫秒值的形式。
我的问题:
在IoTDB表模型中,对 time 的精确筛选是否应始终使用数值时间戳值来编写,还是是否存在可以替代将 time 与纯字符串进行比较的受支持的时间戳字面量/强制转换语法?
解决方案
SELECT `time`, device_id, line_id, pressure
FROM pump_metric
WHERE `time` = 1970-01-01T08:00:02.000;
或
SELECT `time`, device_id, line_id, pressure
FROM pump_metric
WHERE `time` = CAST('1970-01-01 08:00:02.000' AS TIMESTAMP);
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。