这是我在 Druid 的 Web GUI 中运行的
Apache Druid
查询:
SELECT *
FROM my_table
WHERE __time >= '2023-10-19T09:29:58.613Z'
and __time <= '2023-10-19T09:30:13.613Z'
and my_string_field = 'value'
它返回一条记录,其中
__time
字段中的值是 2023-10-19T09:29:58.040Z,小于我的查询中设置的下限。原因似乎是字符串在解析为 Druid
的时间格式时会被截断为秒。我认为是这样,因为查询 SELECT TIME_PARSE('2023-10-19T09:29:58.613Z')
结果是 2023-10-19T09:29:58.000Z
。那么如何精确过滤列 __time
达到毫秒精度(而不牺牲索引字段搜索的效率)?
我不明白的另一件事是,如果我在查询中添加一个字段
TIMESTAMP_TO_MILLIS(__time) as tms
,它会导致1697794200930
为__time
,即2023-10-20T09:30:00.930Z
,如果我添加MILLIS_TO_TIMESTAMP(TIMESTAMP_TO_MILLIS(__time)) as mls
,我会返回2023-10-20T09:30:00.930Z
,但是当我添加 MILLIS_TO_TIMESTAMP(1697794200930) as mls_2
时,我得到 2023-10-20T09:30:00.000Z
而不是 2023-10-20T09:30:00.930Z
(它被截断为秒)。
更新:
我发现
MILLIS_TO_TIMESTAMP
的行为是一个bug,并且已在版本25.0.0
中修复。
原来这是一个错误,并且已修复。我在本地安装了版本
27.0.0
,并且 TIME_PARSE
现在返回毫秒,并且过滤似乎也考虑了毫秒。