TimescaleDB time_bucket() 函数给出任意时间间隔的意外结果
TimescaleDB time_bucket() function giving unexpected results for arbitrary time interval
我创建了一个 hypertable water_meter 来存储传感器数据
它包含以下按时间戳升序排列的数据
select * from water_meter order by time_stamp;
可以看出我的数据从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;
它工作正常,我得到以下数据:
现在,如果我用它来获取 15 天的聚合数据,我会得到意想不到的结果,其中显示 17 April 2020
的开始时间段,table[=19] 中没有数据=]
SELECT
time_bucket('15 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;
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');
我创建了一个 hypertable water_meter 来存储传感器数据
它包含以下按时间戳升序排列的数据
select * from water_meter order by time_stamp;
可以看出我的数据从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;
它工作正常,我得到以下数据:
现在,如果我用它来获取 15 天的聚合数据,我会得到意想不到的结果,其中显示 17 April 2020
的开始时间段,table[=19] 中没有数据=]
SELECT
time_bucket('15 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;
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');