这个工作,虽然它有点倒退,像这样使用SQL。这第一块代码创建了一些临时表来演示解决方案。第二块是实际的解决方案。
CREATE TABLE #demo (
[year] int ,
holiday nvarchar(50) ,
holidaystart date ,
holidayend date);
INSERT INTO #demo ([year] ,
holiday ,
holidaystart ,
holidayend)
VALUES
(2008 ,
'Holiday1' ,
'2008-09-09' ,
'2008-09-30') ,
(2008 ,
'Holiday2' ,
'2008-10-01' ,
'2008-10-21') ,
(2008 ,
'Holiday3' ,
'2008-10-22' ,
'2008-11-12');
CREATE TABLE #result (
[year] int ,
holiday nvarchar(50) ,
holidaydate date);
这是为您提供数据的实际代码,首先使用顶部部分来创建演示数据。
SELECT ROW_NUMBER() OVER(ORDER BY holidaystart) rownum ,
holiday ,
holidaystart ,
holidayend ,
[year]
INTO #foreach_item
FROM #demo;
DECLARE
@Iter int = (SELECT MIN(rownum)
FROM #foreach_item);
DECLARE
@Max int = (SELECT MAX(rownum)
FROM #foreach_item);
WHILE @Iter <= @Max
BEGIN
DECLARE
@First_Day date = DATEADD(dd , -1 , (SELECT holidaystart
FROM #foreach_item
WHERE rownum = @Iter));
DECLARE
@Last_Day date = (SELECT holidayend
FROM #foreach_item
WHERE rownum = @Iter);
DECLARE
@Holiday nvarchar(50) = (SELECT holiday
FROM #foreach_item
WHERE rownum = @Iter);
WHILE @First_Day < @Last_Day
BEGIN
INSERT INTO #result
SELECT [year] ,
holiday ,
DATEADD(dd , 1 , @First_Day)
FROM #foreach_item
WHERE holiday = @Holiday;
SET @First_Day = DATEADD(dd , 1 , @First_Day);
END;
SET @Iter = @Iter + 1;
END;
SELECT *
FROM #result
ORDER BY holiday;