不支持依赖于连续聚合内部本地时区设置的函数。您不能调整为本地时间,因为时区设置因用户而异。
为了管理这个问题,您可以在视图定义中使用显式时区。或者,您可以为使用整数时间列的表创建自己的自定义聚合方案。
使用时区最常见的方法是在视图查询中声明显式时区。
在
psql
提示符下,创建视图并声明时区CREATE MATERIALIZED VIEW device_summaryWITH (timescaledb.continuous)ASSELECTtime_bucket('1 hour', observation_time) AS bucket,min(observation_time AT TIME ZONE 'EST') AS min_time,device_id,avg(metric) AS metric_avg,max(metric) - min(metric) AS metric_spreadFROMdevice_readingsGROUP BY bucket, device_id;或者,您可以在使用
SELECT
在视图之后转换为时间戳。SELECT min_time::timestamp FROM device_summary;
日期和时间通常表示为年-月-日和小时:分钟:秒。大多数 Timescale 数据库使用 日期/时间类型 列来表示日期和时间。但是,在某些情况下,您可能需要将这些常见的时间和日期格式转换为使用整数的格式。最常见的整数时间是 Unix 纪元时间,它是自 1970-01-01 的 Unix 纪元以来的秒数,但其他类型的基于整数的时间格式也是可能的。
这些示例使用名为 devices
的 hypertable(超表),其中包含 CPU 和磁盘使用情况信息。这些设备使用 Unix 纪元来测量时间。
要创建使用基于整数的列作为时间的 hypertable(超表),您需要提供 chunk(块)时间间隔。在本例中,每个 chunk(块)为 10 分钟。
在
psql
提示符下,创建一个表并定义基于整数的时间列CREATE TABLE devices(time BIGINT, -- Time in minutes since epochcpu_usage INTEGER, -- Total CPU usagedisk_usage INTEGER, -- Total disk usagePRIMARY KEY (time));定义 chunk(块)时间间隔
SELECT create_hypertable('devices', by_range('time', 10));
要在使用基于整数的时间的 hypertable(超表)上定义连续聚合,您需要有一个函数来获取当前时间的正确格式,并为 hypertable(超表)设置它。您可以使用 set_integer_now_func
函数来完成此操作。它可以定义为常规 PostgreSQL 函数,但需要是 STABLE
,不带任何参数,并返回与表中时间列类型相同的整数值。设置好时间处理后,您可以创建连续聚合。
在
psql
提示符下,设置一个函数将时间转换为 Unix 纪元CREATE FUNCTION current_epoch() RETURNS BIGINTLANGUAGE SQL STABLE AS $$SELECT EXTRACT(EPOCH FROM CURRENT_TIMESTAMP)::bigint;$$;SELECT set_integer_now_func('devices', 'current_epoch');为
devices
表创建连续聚合CREATE MATERIALIZED VIEW devices_summaryWITH (timescaledb.continuous) ASSELECT time_bucket('500', time) AS bucket,avg(cpu_usage) AS avg_cpu,avg(disk_usage) AS avg_diskFROM devicesGROUP BY bucket;将一些行插入到表中
CREATE EXTENSION tablefunc;INSERT INTO devices(time, cpu_usage, disk_usage)SELECT time,normal_rand(1,70,10) AS cpu_usage,normal_rand(1,2,1) * (row_number() over()) AS disk_usageFROM generate_series(1,10000) AS time;此命令使用
tablefunc
扩展生成正态分布,并使用row_number
函数将其转换为累积序列。检查视图是否包含正确的数据
postgres=# SELECT * FROM devices_summary ORDER BY bucket LIMIT 10;bucket | avg_cpu | avg_disk--------+---------------------+----------------------0 | 63.0000000000000000 | 6.00000000000000005 | 69.8000000000000000 | 9.600000000000000010 | 70.8000000000000000 | 24.000000000000000015 | 75.8000000000000000 | 37.600000000000000020 | 71.6000000000000000 | 26.800000000000000025 | 67.6000000000000000 | 56.000000000000000030 | 68.8000000000000000 | 90.200000000000000035 | 71.6000000000000000 | 88.800000000000000040 | 66.4000000000000000 | 81.200000000000000045 | 68.2000000000000000 | 106.0000000000000000(10 rows)
关键词
在此页面上发现问题?报告问题 或 在 GitHub 上编辑此页面。