Sql select语句中的While循环
我需要编写select语句,在其中选择记录时,它将遍历特定的逻辑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
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)