TimescaleDB time_bucket() 函数给出任意时间间隔的意外结果

问题描述

我创建了一个 hypertable water_meter 来存储传感器数据

它包含以下按时间戳升序排列的数据

select * from water_meter order by time_stamp;

click here to see the results of the above query

可以看出我有01 May 2020 开始的数据

如果我使用 time_bucket() 函数获取每 1 天的聚合:

SELECT
time_bucket('1 days',time_stamp) as bucket,thing_key,avg(pulsel) as avg_pulse_l,avg(pulseh) as avg_pulse_h
FROM
water_meter
GROUP BY thing_key,bucket;

它工作正常,我得到以下数据:

see the results of time_bucket('1 day')

现在,如果我用它来获取 15 天的聚合,我会得到意想不到的结果,其中显示17 April 2020 的起始时间段,而表中没有数据

SELECT
time_bucket('15 days',bucket;

click to see the results for time_bucket('15 days')

解决方法

time_bucket 函数将事物存储到具有隐含范围的存储桶中,即 15 分钟的存储桶可能会显示为“2021-01-01 01:15:00.000+00”或其他内容,但它会包含时间戳在 ['2021-01-01 01:15:00','2021-01-01 01:30:00') 范围内 - 包含左侧,不包含右侧。同样的事情发生了好几天。该存储桶已确定并恰好在 4 月 17 日开始,但将包含以下范围内的数据:["2020-04-17 00:00:00+00","2020-05-02 00:00:00 +00")。您可以使用 TimescaleDB Toolkit extension 中的实验函数来获取这些范围:SELECT toolkit_experimental.time_bucket_range('15 days'::interval,'2020-05-01');

也可以使用offset or origin parameters of the time_bucket function来修改开头:select time_bucket('15 days'::interval,'2020-05-01',origin=>'2020-05-01');