技术需求:基于月度文件日期生成日期范围并按EmpID、StatusCode分组
按EmpID和StatusCode分组生成日期范围解决方案
嘿,我来帮你搞定这个日期范围生成的需求!先把需求再明确下:
需要基于月度文件中的日期生成日期范围,结果按
EmpID和StatusCode分组;其中start日期为分组内最早月份的月初,end日期为分组内最晚月份的月末。
先给你看个示例,方便理解:
示例数据表
| EmpID | StatusCode | MonthDate |
|---|---|---|
| 101 | A | 2023-02-15 |
| 101 | A | 2023-04-20 |
| 101 | B | 2023-03-10 |
| 102 | A | 2023-01-05 |
| 102 | A | 2023-05-25 |
预期结果
| EmpID | StatusCode | start | end |
|---|---|---|---|
| 101 | A | 2023-02-01 | 2023-04-30 |
| 101 | B | 2023-03-01 | 2023-03-30 |
| 102 | A | 2023-01-01 | 2023-05-31 |
具体实现方案(SQL版)
不同数据库的日期函数略有差异,我给你整理了几种常用数据库的写法:
MySQL 写法
SELECT EmpID, StatusCode, DATE_FORMAT(MIN(MonthDate), '%Y-%m-01') AS start, LAST_DAY(MAX(MonthDate)) AS end FROM your_table_name -- 替换成你的实际表名 GROUP BY EmpID, StatusCode;
SQL Server 写法
SELECT EmpID, StatusCode, DATEFROMPARTS(YEAR(MIN(MonthDate)), MONTH(MIN(MonthDate)), 1) AS start, EOMONTH(MAX(MonthDate)) AS end FROM your_table_name -- 替换成你的实际表名 GROUP BY EmpID, StatusCode;
PostgreSQL 写法
SELECT EmpID, StatusCode, DATE_TRUNC('month', MIN(MonthDate))::DATE AS start, (DATE_TRUNC('month', MAX(MonthDate)) + INTERVAL '1 month - 1 day')::DATE AS end FROM your_table_name -- 替换成你的实际表名 GROUP BY EmpID, StatusCode;
逻辑说明
- 核心思路是先按
EmpID和StatusCode分组,把同一员工同状态的记录归为一组 - 对每组里的日期取最小值,再转换成该月的第一天,就是
start - 对每组里的日期取最大值,再转换成该月的最后一天,就是
end
内容的提问来源于stack exchange,提问作者shugs
相关产品推荐
相关产品推荐

