我有一张桌子如下
ID(INT), PeopleID (INT), StartDate (DATE), EndDate(DATE)
1, 1, 2018-01-01, 2018-12-01
2, 1, 2017-01-01, 2017-02-01
我真正想做的就是让查询输出像这样
ID(INT), PeopleID (INT), StartDate (DATE), EndDate(DATE), GenerateDate(DATE)
1, 1, 2018-01-01, 2018-12-01, 2018-01-01
1, 1, 2018-01-01, 2018-12-01, 2018-02-01
1, 1, 2018-01-01, 2018-12-01, 2018-03-01
1, 1, 2018-01-01, 2018-12-01, 2018-04-01
1, 1, 2018-01-01, 2018-12-01, 2018-05-01
1, 1, 2018-01-01, 2018-12-01, 2018-06-01
1, 1, 2018-01-01, 2018-12-01, 2018-07-01
1, 1, 2018-01-01, 2018-12-01, 2018-08-01
1, 1, 2018-01-01, 2018-12-01, 2018-09-01
1, 1, 2018-01-01, 2018-12-01, 2018-10-01
1, 1, 2018-01-01, 2018-12-01, 2018-11-01
1, 1, 2018-01-01, 2018-12-01, 2018-12-01
2, 1, 2017-01-01, 2017-02-01, 2017-01-01
2, 1, 2017-01-01, 2017-02-01, 2017-02-01
我已经尝试过该查询。
DECLARE @StartDate datetime,@EndDate datetime;
SET @StartDate = (select StartDate from x.date);
SET @EndDate = (select EndDate from x.date);
WITH CTE AS
(SELECT @StartDate as theDate
UNION ALL
SELECT DATEADD(day, 1, theDate)
FROM CTE
WHERE DATEADD(day, 1, theDate) <= @EndDate
)
SELECT CAST(theDate AS DATE) AS GenerateDate
FROM CTE
OPTION (MAXRECURSION 0);
,但由于包含多个值而导致错误消息,我被卡住了。有人可以给我任何答案/技巧/提示吗?
答案 0 :(得分:3)
CREATE TABLE test (id INT, peopleid INT, startdate DATE, enddate DATE)
INSERT INTO test VALUES (1, 1, '1/1/2018', '12/1/2018'),
(2, 1, '1/1/2017', '2/1/2017')
;WITH cte AS (
SELECT id, peopleid, startdate, enddate, startdate AS generatedate
FROM test
UNION ALL
SELECT id, peopleid, startdate, enddate, DATEADD(MONTH, 1, generatedate)
FROM cte
WHERE generatedate < enddate
)
SELECT * FROM cte
ORDER BY id, generatedate
结果:
id peopleid startdate enddate generatedate
1 1 2018-01-01 2018-12-01 2018-01-01
1 1 2018-01-01 2018-12-01 2018-02-01
1 1 2018-01-01 2018-12-01 2018-03-01
1 1 2018-01-01 2018-12-01 2018-04-01
1 1 2018-01-01 2018-12-01 2018-05-01
1 1 2018-01-01 2018-12-01 2018-06-01
1 1 2018-01-01 2018-12-01 2018-07-01
1 1 2018-01-01 2018-12-01 2018-08-01
1 1 2018-01-01 2018-12-01 2018-09-01
1 1 2018-01-01 2018-12-01 2018-10-01
1 1 2018-01-01 2018-12-01 2018-11-01
1 1 2018-01-01 2018-12-01 2018-12-01
2 1 2017-01-01 2017-02-01 2017-01-01
2 1 2017-01-01 2017-02-01 2017-02-01