如何在MS Access中通过SELECT语句将日期范围拆分为多行
在MS Access中拆分员工起止日期为每日记录
要实现把每个员工的起止日期区间拆分成每一天的单独记录,在Access里我们可以借助一个日期辅助表来实现——因为Access不像SQL Server那样支持递归CTE(虽然新版本有有限支持,但辅助表的方式兼容性更好)。
步骤1:创建日期辅助表
首先你需要建一个叫DateList的表,只需要一个DateValue字段(日期类型),然后填充上覆盖你所有员工起止日期范围的所有日期。比如你可以用这段查询快速生成日期(假设要生成2018年全年的日期):
INSERT INTO DateList (DateValue) SELECT DateAdd("d", [num]-1, #2018/01/01#) AS DateValue FROM ( SELECT TOP 365 RowNumber AS num FROM ( SELECT COUNT(*) AS RowNumber FROM MSysObjects AS a, MSysObjects AS b, MSysObjects AS c ) AS Numbers ORDER BY num );
注:如果你的日期范围更大,调整
TOP的数值和起始日期即可。
步骤2:编写主查询
接下来就可以用员工表和DateList表做关联,筛选出每个员工起止日期内的所有日期:
SELECT E.Emp_ID, E.Employee_Name, Format(D.DateValue, "dd-mm-yyyy") AS [Date] FROM Employees AS E INNER JOIN DateList AS D ON D.DateValue BETWEEN E.[Start Date] AND E.[End date] ORDER BY E.Emp_ID, D.DateValue;
这里假设你的员工表名叫
Employees,如果实际表名不同记得替换。Format函数是为了把日期转换成你需要的dd-mm-yyyy格式。
效果验证
用你给出的示例数据,这个查询会返回:
| Emp_ID | Employee_Name | Date |
|---|---|---|
| A0001 | Adam | 25-03-2018 |
| A0001 | Adam | 26-03-2018 |
| A0001 | Adam | 27-03-2018 |
| A0001 | Adam | 28-03-2018 |
| A0001 | Adam | 29-03-2018 |
| A0001 | Adam | 30-03-2018 |
| A0001 | Adam | 31-03-2018 |
| B0052 | Brad | 28-04-2018 |
| B0052 | Brad | 29-04-2018 |
| B0052 | Brad | 30-04-2018 |
完全符合你想要的结果~
内容的提问来源于stack exchange,提问作者M.Brahim
相关产品推荐
相关产品推荐

