【问题标题】:date_trunc 5 minute interval in PostgreSQL [duplicate]PostgreSQL中的date_trunc 5分钟间隔[重复]
【发布时间】:2012-08-23 08:22:06
【问题描述】:

可能重复:
What is the fastest way to truncate timestamps to 5 minutes in Postgres?
Postgresql SQL GROUP BY time interval with arbitrary accuracy (down to milli seconds)

我想在 PostgreSQL 中每隔 5 分钟聚合一次数据。如果我使用date_trunc() 函数,我可以按每小时、每月、每天、每周等时间间隔聚合数据,但不能像 5 分钟或 5 天这样的特定时间间隔聚合数据。

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

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

【问题讨论】:

  • 你问的是stackoverflow.com/questions/7299342/…之类的东西吗?
  • 您想要每 5 分钟的值(即使时隙没有数据),还是只跳过没有数据的间隔?
  • 值得一提的是你的Pg版本;它会影响人们在写答案时可用的功能。

标签: sql postgresql datetime aggregate-functions


【解决方案1】:
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 - 12,请添加1。
我将extract() 的结果转换为整数,所以除法/ 5 会截断小数位数。结果:
分钟 0 - 4 -> 插槽 0
第 5 - 9 分钟 -> 插槽 1
等等

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

【讨论】:

  • 来学习DATE_TRUNC;学习了 GROUP BY 1, 2
【解决方案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”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 2019-08-01
    • 2020-07-30
    • 1970-01-01
    • 2019-12-25
    • 1970-01-01
    相关资源
    最近更新 更多