Sql select语句中的While循环

Sql select语句中的While循环,sql,sql-server,Sql,Sql Server,我需要编写select语句,在其中选择记录时,它将遍历特定的逻辑 Start_Date End_Date 2011-01-01 2011-04-01 如果我有上述记录,那么我需要根据两个日期之间的月数差异写入输出。(在每次迭代中,需要将开始日期增加一个月,以便差值仅为个月) 最终输出: Start_Date End_Date Date_Col 2011-01-01 2011-04-01 2011-01-01 2011-01-01 2011-04-01 2011-02-01 201

我需要编写select语句,在其中选择记录时,它将遍历特定的逻辑

Start_Date  End_Date
2011-01-01   2011-04-01
如果我有上述记录,那么我需要根据两个日期之间的月数差异写入输出。(在每次迭代中,需要将开始日期增加一个月,以便差值仅为个月)

最终输出:

Start_Date  End_Date  Date_Col
2011-01-01  2011-04-01 2011-01-01
2011-01-01  2011-04-01 2011-02-01
2011-01-01  2011-04-01 2011-03-01
2011-01-01  2011-04-01 2011-04-01
这里有一个解决方案

DECLARE @Start_Date DATETIME = '2011-01-01',
        @End_Date DATETIME = '2011-04-01';
WITH DateArray
AS
(SELECT @Start_Date AS DateElement
  UNION ALL
  SELECT DATEADD (month, 1, DateElement) FROM DateArray WHERE DateElement < @End_Date
)
SELECT CONVERT(VARCHAR(10), @Start_Date,120) Start_Date,
       CONVERT(VARCHAR(10), @End_Date,120) End_Date,
       CONVERT(VARCHAR(10), DateElement,120) Date_Col
  FROM DateArray;

与递归cte相比,我更喜欢数字表解决方案。 这种方法有几个好处——主要好处是性能

如果您还没有数字表,您可能应该阅读Jeff Moden的以及关于在SQL Server中创建数字表的内容

因此,一旦创建了数字表,它就是一个简单的联接:

SELECT Start_Date, 
       End_Date, 
       DATEADD(MONTH, Number, Start_Date) As Date_Col
FROM YourTable
JOIN Numbers ON Number <= DATEDIFF(MONTH, Start_Date, End_Date)
选择开始日期,
结束日期,
DATEADD(月份、编号、开始日期)作为日期列
从你的桌子上

连接您正在使用的数据库管理系统的编号?支持递归?在Postgres中,您可以
生成\u series()
数据库是SQL Server
SELECT Start_Date, 
       End_Date, 
       DATEADD(MONTH, Number, Start_Date) As Date_Col
FROM YourTable
JOIN Numbers ON Number <= DATEDIFF(MONTH, Start_Date, End_Date)