2016-08-03 71 views
1

需要創建一個帶有日期列表的IN子句。該列表需要按降序排列。我創建了一個@cols變量命名,我試圖用這個代碼來填充它:如何在SQL中使用While循環創建變量

declare @end date='2016/05/30' 
declare @begin date = DATEADD(month, DATEDIFF(month, 0, @end), 0) ; 
declare @curdate date = @end; -- start on the last day 
print @curdate; 
print @begin; 

DECLARE @cols NVARCHAR (MAX) 

while @curdate >[email protected] -- goes from end of the month to beginning of the month 
begin 
    select @cols = @cols + ',[' + CONVERT(NVARCHAR, @curdate, 106) + ']'; 
    select @curdate = DATEADD(DAY,-1,@curdate) -- subtract a day 
end 

print @cols; 
print @curdate; 
print @begin; 

我希望能獲得16年5月30日,16年5月29日,16年5月28日等(正常當然格式化)。代碼運行時沒有錯誤,但@cols總是空的。

+3

你應該熟悉一個理貨表。你應該在這種情況下使用,而不是循環。 http://www.sqlservercentral.com/articles/T-SQL/62867/ –

回答

5

你得到NULL@Cols的原因是因爲在進入while循環之前它沒有被賦值。它仍然是NULLNULL +任何東西= NULL

爲了解決這個問題,你可以設置@Cols等於while循環前一個空字符串:

DECLARE @cols NVARCHAR (MAX) = '' 
0

你爲什麼要傳遞日期的列表,以IN子句?你不能只使用如下的簡單日期範圍嗎?

DECLARE @enddate = '2016-05-30' 

SELECT * 
FROM sometable 
WHERE somedate >= DATEADD(month, DATEDIFF(month, 0, @enddate), 0) 
    AND somedate < EOMONTH(@enddate) 
+0

這是一個好主意,但是我需要一個日期列表作爲數據透視表中的in子句的一部分。 – Missy