SQLServer生成日期以在两个日期之间行

时间:2018-10-10 04:40:36

标签: sql-server

我有一张桌子如下

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);

,但由于包含多个值而导致错误消息,我被卡住了。有人可以给我任何答案/技巧/提示吗?

1 个答案:

答案 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

http://www.sqlfiddle.com/#!18/8ad9d/2