我需要编写select语句,其中将在选择记录本身的同时迭代特定逻辑。
Start_Date End_Date
2011-01-01 2011-04-01
如果我有以上记录,那么我需要根据两个日期之间的月差来写入输出。 (在每次迭代时都需要将start_date增加一个月,以便差异只有几个月)
最终输出:
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
答案 0 :(得分:0)
这是一个解决方案
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;
输出
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
答案 1 :(得分:0)
我更喜欢数字表解决方案而不是递归cte。 这种方法有几个好处 - 主要好处是性能。
如果您还没有数字表,您应该阅读Jeff Moden的The "Numbers" or "Tally" Table: What it is and how it replaces a loop,以及this SO post在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)