2010-12-20 61 views
1

我怎样才能自动填充CTE包含每月 如第一天:自动填充CTE在SQL Server

2010年1月1日
2010年2月1日
2010年3月1日
4-1-2010

等等。我正在寻找一个查询来执行此操作,而不是使用UNION运算符。

回答

4

看一看像

DECLARE @StartDate DATETIME, 
     @EndDate DATETIME 

SELECT @StartDate = '01 Jan 2010', 
     @EndDate = '01 Jan 2011' 

;WITH Dates AS (
     SELECT @StartDate StartOfMonth 
     UNION ALL 
     SELECT DATEADD(month,1,StartOfMonth) StartOfMonth 
     FROM Dates 
     WHERE DATEADD(month,1,StartOfMonth) <= @EndDate 
) 
SELECT * 
FROM Dates 

输出

StartOfMonth 
----------------------- 
2010-01-01 00:00:00.000 
2010-02-01 00:00:00.000 
2010-03-01 00:00:00.000 
2010-04-01 00:00:00.000 
2010-05-01 00:00:00.000 
2010-06-01 00:00:00.000 
2010-07-01 00:00:00.000 
2010-08-01 00:00:00.000 
2010-09-01 00:00:00.000 
2010-10-01 00:00:00.000 
2010-11-01 00:00:00.000 
2010-12-01 00:00:00.000 
2011-01-01 00:00:00.000 

编辑

随着列名提供

DECLARE @StartDate DATETIME, 
     @EndDate DATETIME 

SELECT @StartDate = '01 Jan 2010', 
     @EndDate = '01 Jan 2011' 

;WITH Dates (dt) AS (
     SELECT @StartDate dt 
     UNION ALL 
     SELECT DATEADD(month,1,dt) dt 
     FROM Dates 
     WHERE DATEADD(month,1,dt) <= @EndDate 
) 
SELECT * 
FROM Dates 
+0

+10(如果我可以:)为通用代码 – Jonk 2010-12-20 12:33:19

+0

如果我的CTE采取了一个参数,如何更改查询; WITH DATES(dt) – Jonk 2010-12-20 12:47:32

+0

你是什么意思*如果我的CTE带了一个参数像WITH WITH DATES DT)*?您是从http://msdn.microsoft.com/en-us/library/ms190766.aspx * WITH expression_name [(column_name [,... n])] * – 2010-12-20 12:50:02

1
WITH CTEDates AS 
(
SELECT CAST('20100101' AS DATETIME) AS DateVal 
UNION ALL 
SELECT DATEADD(mm, 1, DateVal) 
FROM CTEDates 
WHERE DateVal < '20101201' 
) 

SELECT * FROM CTEDates 
+0

非常感谢你! – Jonk 2010-12-20 12:33:00