You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Snowflake中生成两个时间戳间的所有小时级时间戳?

在Snowflake中生成指定时间范围内的小时级时间序列

方法一:使用GENERATOR函数(性能优先)

这是Snowflake中生成时间序列最高效的方式,适合大多数场景:

WITH time_bounds AS (
    SELECT 
        MIN(your_timestamp_col) AS min_ts,
        MAX(your_timestamp_col) AS max_ts
    FROM your_table_name
)
SELECT 
    DATEADD(HOUR, seq4(), min_ts) AS hourly_timestamp
FROM time_bounds,
     TABLE(GENERATOR(ROWCOUNT => (SELECT DATEDIFF(HOUR, min_ts, max_ts) + 1 FROM time_bounds)))
WHERE DATEADD(HOUR, seq4(), min_ts) <= max_ts;
  • 先通过time_bounds CTE获取目标表时间列的最小、最大值
  • GENERATOR生成刚好覆盖时间范围的行数(小时差+1,确保首尾都包含)
  • seq4()生成连续整数,配合DATEADD逐小时递增生成时间序列
  • 最后过滤避免因边界计算产生的超出最大时间的行

方法二:使用递归CTE(逻辑直观)

如果更倾向于理解递归逻辑,可以用这种方式:

WITH RECURSIVE hourly_series AS (
    SELECT MIN(your_timestamp_col) AS hourly_ts
    FROM your_table_name
    UNION ALL
    SELECT DATEADD(HOUR, 1, hourly_ts)
    FROM hourly_series
    WHERE DATEADD(HOUR, 1, hourly_ts) <= (SELECT MAX(your_timestamp_col) FROM your_table_name)
)
SELECT hourly_ts FROM hourly_series;
  • 初始查询获取时间范围的起始点(最小时间戳)
  • 递归部分每次将上一个时间加1小时,直到达到最大时间戳为止
  • 最终返回完整的小时级时间序列

注意事项

  • 替换代码中的your_timestamp_col为表中实际的时间列名,your_table_name为目标表名
  • 若需要将起始时间对齐到整点(比如原最小时间是10:25,想要从10:00开始),可以把MIN(your_timestamp_col)替换为DATE_TRUNC('HOUR', MIN(your_timestamp_col))
  • 当时间跨度极大时,GENERATOR方法的性能显著优于递归CTE

内容的提问来源于stack exchange,提问作者Felipe Hoffa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 11:17:08