while循环里面的select语句

时间:2017-12-13 14:53:05

标签: sql sql-server

我需要编写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

2 个答案:

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

You can see a live demo on rextester.

相关问题