SQLServer生成两个日期之间的行的日期

问题描述 投票:1回答:1

我有一张表如下

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

但最终得到一条错误消息,因为它有多个值,我被卡住了。有人可以给我任何答案/提示/提示吗?

sql-server
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.