如何在SQLServer2005中获取日期作为标头

如何在SQLServer2005中获取日期作为标头,sql,sql-server-2005,Sql,Sql Server 2005,我正在尝试将日期作为标题,根据当前日期的不同而变化。下面是我在SQLServer2005中尝试执行的一个示例。 选择c.[ar cust edi sef type], 当 s、 [ar销售日期]如DATEADDdd、0、DATEDIFFdd、0、GETDATE-7和s[ar销售单据类型]如“发票” 然后s.【应收销售余额到期】 否则0将以getdate结束 getdate不起作用。有没有办法将日期作为标题返回?列标题不能是动态的。您可以从以下事实中看出这一点:通常不将它们指定为字符串,而是将它们

我正在尝试将日期作为标题,根据当前日期的不同而变化。下面是我在SQLServer2005中尝试执行的一个示例。 选择c.[ar cust edi sef type], 当 s、 [ar销售日期]如DATEADDdd、0、DATEDIFFdd、0、GETDATE-7和s[ar销售单据类型]如“发票” 然后s.【应收销售余额到期】 否则0将以getdate结束


getdate不起作用。有没有办法将日期作为标题返回?

列标题不能是动态的。您可以从以下事实中看出这一点:通常不将它们指定为字符串,而是将它们指定为标识符

SELECT 1 as TestColumn
而不是

SELECT 1 as 'TestColumn'
您可以通过exec执行查询的形式来做您想做的事情


这就是日期标题的意思吗


您可以在不使用pivot的情况下执行此操作,但mssql大多使用pivot。

此代码将日期列为列标题。使用动态枢轴来获得结果。首先,我创建一个带有日期和随机文本的表来测试解决方案。替换表格并相应地更改代码

如果您能提供您的模式和数据,那么答案将更加适用和实用

DECLARE @StartDate DATE = '20110901'
, @EndDate DATE = '20111001'

SELECT  DATEADD(DAY, nbr - 1, @StartDate) AS [Date]
,'test' AS  [Value]
into #temp_Dates
FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY c.object_id ) AS Nbr
      FROM      sys.columns c
    ) nbrs
WHERE   nbr - 1 <= DATEDIFF(DAY, @StartDate, @EndDate)
-------------------------------------------------------------------------------------- 


-----------Dynamic PIVOT section to make the date as a column header------------------

DECLARE @SQL  AS VARCHAR(MAX)
, @cols_ AS  vARCHAR(MAX) 
, @Table_Name VARCHAR(20)
SET @Table_Name = '#temp_Dates' 

--Making the column list dynamically 
 SELECT @cols_   = STUFF((SELECT DISTINCT ', '+QUOTENAME(  [T2].[Date]) 
               FROM  #temp_Dates [T2]              
               FOR XML PATH('')), 1, 1, '')          

SET @SQL = ' SELECT
       pivoted.* 
     
      FROM 
      (

      SELECT * 
      
      FROM  '+@Table_Name+'
     
      ) AS [p]
      PIVOT
      (
         MIN([P].[Value]) 
         FOR  [P].[Date]  IN (' + @cols_ + ')         
      ) AS pivoted;        

   ';

  PRINT( @SQL)
  EXEC (@SQL)


  DROP TABLE #temp_Dates

结果:

执行此操作的常用方法是添加一个要查询的日期字段,然后在应用程序或报表逻辑中处理布局。考虑这一点:如果页眉是动态的,您打算如何在报表或应用程序中引用它?您也必须在那里动态地确定它,并希望您的逻辑匹配。
DECLARE @StartDate DATE = '20110901'
, @EndDate DATE = '20111001'

SELECT  DATEADD(DAY, nbr - 1, @StartDate) AS [Date]
,'test' AS  [Value]
into #temp_Dates
FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY c.object_id ) AS Nbr
      FROM      sys.columns c
    ) nbrs
WHERE   nbr - 1 <= DATEDIFF(DAY, @StartDate, @EndDate)
-------------------------------------------------------------------------------------- 


-----------Dynamic PIVOT section to make the date as a column header------------------

DECLARE @SQL  AS VARCHAR(MAX)
, @cols_ AS  vARCHAR(MAX) 
, @Table_Name VARCHAR(20)
SET @Table_Name = '#temp_Dates' 

--Making the column list dynamically 
 SELECT @cols_   = STUFF((SELECT DISTINCT ', '+QUOTENAME(  [T2].[Date]) 
               FROM  #temp_Dates [T2]              
               FOR XML PATH('')), 1, 1, '')          

SET @SQL = ' SELECT
       pivoted.* 
     
      FROM 
      (

      SELECT * 
      
      FROM  '+@Table_Name+'
     
      ) AS [p]
      PIVOT
      (
         MIN([P].[Value]) 
         FOR  [P].[Date]  IN (' + @cols_ + ')         
      ) AS pivoted;        

   ';

  PRINT( @SQL)
  EXEC (@SQL)


  DROP TABLE #temp_Dates