如何遍历含两日期列的表并生成日期范围内所有连续日期
解决方案
以下为不同工具场景下的实现方法:
1. SQL 实现(适配 Hive/Spark SQL/PostgreSQL/MySQL 8.0+ 等支持递归 CTE 的数据库)
核心逻辑是先生成覆盖所有待拆分区间的连续日期序列,再和原表做范围关联:
-- 原表名为 date_range_table WITH RECURSIVE date_series AS ( SELECT MIN(`from`) AS dt FROM date_range_table UNION ALL SELECT DATE_ADD(dt, INTERVAL 1 DAY) FROM date_series WHERE dt < (SELECT MAX(`to`) FROM date_range_table) ) SELECT t.id, ds.dt AS `date` FROM date_range_table t INNER JOIN date_series ds ON ds.dt BETWEEN t.`from` AND t.`to` ORDER BY t.id, ds.dt;
如果使用不支持递归 CTE 的低版本数据库,可以提前维护一张日历维度表替换上述的date_series,关联逻辑不变。
2. Python Pandas 实现
import pandas as pd # 示例读取原表到df,实际使用时替换为你自己的读表逻辑 df = pd.DataFrame({ 'id': [1, 1], 'from': pd.to_datetime(['01/01/2021', '06/01/2021'], dayfirst=True), 'to': pd.to_datetime(['03/01/2021', '07/01/2021'], dayfirst=True) }) # 拆分日期区间并展开为行 df['date'] = df.apply(lambda x: pd.date_range(start=x['from'], end=x['to']), axis=1) result_df = df.explode('date')[['id', 'date']] # 如需要输出为原格式的字符串,加以下代码 result_df['date'] = result_df['date'].dt.strftime('%d/%m/%Y')
3. Excel 实现(用Power Query)
- 选中你的数据表,点击「数据」选项卡 → 「从表格/区域」导入Power Query编辑器
- 选中
from和to两列,点击「添加列」→ 「自定义列」,输入公式:= List.Dates([from], Duration.Days([to] - [from]) + 1, #duration(1, 0, 0, 0)) - 点击新生成的自定义列右上角的展开按钮,选择「扩展到新行」
- 删除不需要的
from、to列,调整格式后导出即可。
内容的提问来源于stack exchange,提问作者user2957125
相关产品推荐
相关产品推荐

