如何在Microsoft SQL Server中查询生成连续有序的项目工作流日程
解决方案
你可以直接用SQL Server提供的LEAD窗口函数实现需求,核心逻辑是按项目分组后,取当前阶段下一个阶段的开始日期减1天,作为当前阶段的结束日期,就能得到连续的日程区间。
具体查询语句
SELECT project_id, phase, start_date, -- 下一个阶段开始日期减1天为当前阶段结束日期,最后一个阶段默认结束日期取当前开始日期,可按需调整 ISNULL( DATEADD(DAY, -1, LEAD(start_date) OVER (PARTITION BY project_id ORDER BY start_date)), start_date ) AS end_date FROM project_phases ORDER BY project_id, start_date;
结果说明
用你提供的测试数据执行后,输出结果如下:
| project_id | phase | start_date | end_date |
|---|---|---|---|
| 1 | design | 2021-01-01 | 2021-01-01 |
| 1 | development | 2021-01-02 | 2021-01-02 |
| 1 | deployment | 2021-01-03 | 2021-01-03 |
如果你需要自定义最后一个阶段的结束日期,比如改成项目指定的交付日期,或者查询当天的日期,直接修改ISNULL的第二个参数即可,比如改成GETDATE()就会取执行查询当天的日期作为最后一个阶段的结束日期。
如果需要把生成的日程保存为新表,在SELECT后加INTO 新表名即可:
SELECT project_id, phase, start_date, ISNULL(DATEADD(DAY, -1, LEAD(start_date) OVER (PARTITION BY project_id ORDER BY start_date)), start_date) AS end_date INTO project_schedule FROM project_phases;
内容的提问来源于stack exchange,提问作者Shailendra Sisodia
相关产品推荐
相关产品推荐

