首页/数据/NoSQL 速查/SQL 通用时间桶写法

SQL 通用时间桶写法

用 SQL 做时序统计时先把时间戳对齐到桶再聚合:date_trunc 适配 PostgreSQL/ClickHouse,floor 取整适配通用整数运算,两者结果都按桶标签分组。

NoSQL 速查数据更新于 2026-10-12
对齐目标把每行时间归入 5 分钟/1 小时/1 天等窗口,作为 GROUP BY 键
通用思路bucket = floor(epoch(t) / 窗口秒数) * 窗口秒数
函数写法date_trunc('hour', ts)(PostgreSQL)、toStartOfInterval(ts, INTERVAL 1 HOUR)(ClickHouse)

示例

示例
-- 通用取整写法(窗口 300 秒)
SELECT floor(extract(epoch FROM ts) / 300) * 300 AS bucket_s,
       avg(value) AS avg_value,
       count(*) AS samples
FROM metrics
WHERE ts >= now() - INTERVAL '1 day'
GROUP BY bucket_s
ORDER BY bucket_s;
跨库对照时先确认时区与周起点规则;报表口径固定后把桶表达式封装成视图或函数,避免每处重写。

易错点

  • 按秒取整的计算在时区或夏令时切换日会出现错位,跨时区报表用带时区的时间列
  • 桶边界规则不一致会导致相邻系统对不上数,先统一左闭右开与对齐起点

数据来源与参考

  • PostgreSQL Docs: date_trunc
  • ClickHouse Docs: Date and time functions
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌