PostgreSQL 中的 date_trunc 5 分钟间隔[重复]

问题描述 投票:0回答:2

可能重复:
在 Postgres 中将时间戳截断为 5 分钟的最快方法是什么?
Postgresql SQL GROUP BY 任意精度的时间间隔(低至毫秒)

我想在 PostgreSQL 中以 5 分钟的间隔聚合数据。如果我使用

date_trunc()
功能,我可以按每小时、每月、每天、每周等间隔聚合数据,但不能按 5 分钟或 5 天等特定间隔聚合数据。

select date_trunc('hour', date1), count(*) from table1 group by 1;

我们如何在 PostgreSQL 中实现这一目标?

sql postgresql datetime aggregate-functions
2个回答
48
投票

Postgres 14 或更高版本

使用

date_bin()

SELECT date_bin('5 min', date1, '2000-1-1') AS min5_slot
     , count(*)
FROM   table1
GROUP  BY 1
ORDER  BY 1;

参见:

Postgres 13 或以上

SELECT date_trunc('hour', date1) AS hour_stump
     , (extract(minute FROM date1)::int / 5) AS min5_slot
     , count(*)
FROM   table1
GROUP  BY 1, 2
ORDER  BY 1, 2;

您可以

GROUP BY
两列:截断为小时的时间戳和 5 分钟时段。

该示例生成插槽

0 - 11
。如果您愿意,请添加
1
1 - 12

我将
extract()
的结果转换为整数,因此除法
/ 5
会截断小数位。结果:
分钟 0 - 4 -> 插槽 0
第 5 - 9 分钟 -> 第 1 时段
等等

此查询仅返回找到值的 5 分钟时段的值。如果您想要每个时段的值,或者如果您想要5分钟时段的运行总和,请考虑以下相关答案:


2
投票

这是一个简单的查询,您可以将其包装在函数中或在各处剪切和粘贴:

select now()::timestamp(0), (extract(epoch from now()::timestamptz(0)-date_trunc('d',now()))::int)/60;

它会给你当前时间,以及一个从 0 到 n-1 的数字,其中 n=60。要每 5 分钟执行一次,请将该数字设置为 300,依此类推。它按自一天开始以来的秒数进行分组。要使其按自年开始、小时开始或其他时间开始的秒数分组,请更改 date_trunc 中的“d”。

© www.soinside.com 2019 - 2024. All rights reserved.