2011-08-24 132 views
1

我需要具有@startDate和@endDate参数的存储过程的select语句。它需要返回基于日期范围参数在一个月内标记的动态数量的列(“2011年8月”)格式。每个日期范围的动态月份年份列

例如,如果 @startDate = 1/1/2011和 @EndDate = 3/1/2011

结果集看起来是这样的:

column headers ----> January 2011 | February 2011 | March 2011 
rows with data ---->  123  |  3456  | 793 

函数取对应于列标题的日期时间将用于数据行

这可能吗?使用枢轴? 在此先感谢您的回复!

+0

难道他们总是会在同一年和/或从1月开始,否则可能会穿越历年?提供的日期是否始终是该月的第一天,并且不包含任何时间?什么版本的SQL Server? –

+0

什么版本的SQL Server? – JNK

+0

日期范围可能会跨越日历年。参数是DATETIME不包含任何时间。每月的某一天可能是任何有效的一天,而不仅仅是第一天。 SQL Server 8.0.2039是SQL Server 2000 – kenalacom

回答

2

假设您不需要触摸任何表(所有数据都来自函数)。请注意,SQL Server 2000中本地NVARCHAR变量的限制是4,000个字符,因此您需要小心您的范围可能有多长。

DECLARE 
    @startDate SMALLDATETIME, 
    @endDate SMALLDATETIME; 

SELECT 
    @startDate = '20110101', 
    @endDate = '20110301'; 


DECLARE 
    @i  INT, 
    @sd  SMALLDATETIME, 
    @sql  NVARCHAR(MAX), 
    @column VARCHAR(32), 
    @columns NVARCHAR(4000); 

SELECT @i = 0, @columns = N''; 

WHILE @i <= DATEDIFF(MONTH, @startDate, @endDate) 
BEGIN 
    SET @sd = DATEDIFF(DAY, 0, DATEADD(MONTH, @i, @startDate)); 

    SET @column = DATENAME(MONTH, @sd) 
     + ' ' + CONVERT(VARCHAR(20), YEAR(@sd)); 

    SET @columns = @columns + ',' + CHAR(13) + CHAR(10) 
     + ' [' + @column + ']' + ' = dbo.FunctionName(''' + @column + ''')'; 

    SET @i = @i + 1; 
END 

SET @sql = 'SELECT ' + STUFF(@columns, 1, 1, '') + ';'; 

PRINT @sql; 
--EXEC sp_executesql @sql; 

在这种情况下,该收益率:

SELECT 
[January 2011] = dbo.FunctionName('January 2011'), 
[February 2011] = dbo.FunctionName('February 2011'), 
[March 2011] = dbo.FunctionName('March 2011'); 
+1

辉煌!我喜欢这种方法。非常感谢Aaron。我可以使用这个。 – kenalacom

相关问题