我找到了使用循环的解决方法。后续步骤如下:
创建一个临时表来保存初始值。
CREATE TABLE #EMP
(
EMPID VARCHAR(10),
EMPNAME VARCHAR(10),
START_DATE DATE,
END_DATE DATE
);
插入初始值。
INSERT INTO #EMP
SELECT '1001', 'Shivansh', '2015-09-01', '2018-03-31';
INSERT INTO #EMP
SELECT '1004', 'Mayank', '2019-04-01', '2020-06-30';
创建所需的表。
CREATE TABLE #NEWEMP
(
EMPID VARCHAR(10),
EMPNAME VARCHAR(10),
START_DATE DATE,
END_DATE DATE
);
插入第一年的日期(即,如果元组的 START_DATE 为 2015-09-01,则插入 2015-09-01 为 START_DATE 和 2015-12-31 为 END_DATE)。
INSERT INTO #NEWEMP
SELECT EMPID, EMPNAME, START_DATE, DATEFROMPARTS(YEAR(START_DATE), 12, 31) FROM #EMP;
同样,插入最后一年的日期。
INSERT INTO #NEWEMP
SELECT EMPID, EMPNAME, DATEFROMPARTS(YEAR(END_DATE), 1, 1), END_DATE FROM #EMP;
运行 while 循环,直到 START_DATE 和 END_DATE 列之间的差值达到最大值。
DECLARE @counter INT = 1;
DECLARE @len INT = (SELECT MAX(DATEDIFF(YEAR, START_DATE, END_DATE)) FROM #EMP);
WHILE @counter < @len
BEGIN
INSERT INTO #NEWEMP
SELECT EMPID, EMPNAME, DATEFROMPARTS(YEAR(START_DATE) + @counter, 1, 1), DATEFROMPARTS(YEAR(START_DATE) + @counter, 12, 31) FROM #EMP
WHERE @counter < DATEDIFF(YEAR, START_DATE, END_DATE);
SET @counter += 1;
END
查询输出。
SELECT * FROM #NEWEMP ORDER BY START_DATE;
这是用 Azure Synapse Analytics 编写的查询。
所需的输出是。