如何在Snowflake中生成日期范围而非仅获取DATEDIFF天数?
在Snowflake中展开日期范围为具体日期的解决方案
你可以通过**横向关联(LATERAL JOIN)**结合GENERATE_SERIES函数来实现,为每一行的日期范围生成对应的所有具体日期。以下是具体的SQL写法:
SELECT s.date_in_range, t.start_date, t.end_date FROM table1 t LATERAL ( -- 生成从0到日期差的整数序列,再转换为对应日期 SELECT DATEADD(day, value, t.start_date) AS date_in_range FROM TABLE(GENERATE_SERIES(0, DATEDIFF(day, t.start_date, t.end_date))) ) s -- 按起始日期和生成日期排序,结果更清晰 ORDER BY t.start_date, s.date_in_range;
逻辑说明
- 对
table1中的每一行,用DATEDIFF(day, start_date, end_date)计算起始日到结束日的天数差 GENERATE_SERIES(0, 天数差)生成从0到该天数差的整数序列,每个整数代表从起始日往后偏移的天数- 通过
DATEADD(day, value, start_date)将偏移量转换为具体日期,得到日期范围内的每一天 - 用
LATERAL JOIN将生成的日期序列与原表的行关联,最终展开所有日期
示例结果
针对你提供的两行数据,执行后会得到如下结果(仅展示第一行的部分数据):
| date_in_range | start_date | end_date |
|---|---|---|
| 2022-09-03 | 2022-09-03 | 2022-09-17 |
| 2022-09-04 | 2022-09-03 | 2022-09-17 |
| ... | ... | ... |
| 2022-09-17 | 2022-09-03 | 2022-09-17 |
可选调整
如果不需要包含结束日end_date,只需将GENERATE_SERIES的上限改为DATEDIFF(day, t.start_date, t.end_date) - 1即可:
FROM TABLE(GENERATE_SERIES(0, DATEDIFF(day, t.start_date, t.end_date) - 1))
内容的提问来源于stack exchange,提问作者JohnB
相关产品推荐
相关产品推荐

