日期的动态列

时间:2015-06-08 14:59:58

标签: sql sql-server

专栏[今天],[30天前],[60天前],[90天前]

我有一张桌子,它将为我提供今天和30天前,60天前和90天前的销售号码,

但我的问题是弄清楚60天前的实际日期。 我想更新我的脚本不是60天前给我看的,而是为了告诉我60天前的实际日期。我想让我的列动态,所以我得到90天前的实际日期。

有人可以帮我吗?

请记住这是一个很长的脚本和10列,我想更改每一列以显示实际日期,而不是90天前。

4 个答案:

答案 0 :(得分:2)

您可以使用GETDATE()DATEADD()来获取这些值:

SELECT CONVERT(DATE, GETDATE()) AS Today, 
       CONVERT(DATE, DATEADD(DAY, -30, GETDATE())) Minus30

转换为DATE只会取消时间部分。

产地:

Today       Minus30
2015-06-08  2015-05-09

要使用这些值,您可以分配一些变量并设置稍后在代码中使用的值:

DECLARE @today DATE, @Minus30 DATE

SELECT @today = CONVERT(DATE, GETDATE()), 
       @Minus30 = CONVERT(DATE, DATEADD(DAY, -30, GETDATE()))

PRINT @today
PRINT @Minus30

要将值用作列名,您需要使用一些动态SQL:

DECLARE @today NVARCHAR(15), @Minus30 NVARCHAR(15)

SELECT @today = CONVERT(NVARCHAR(15), CONVERT(DATE, GETDATE())), 
   @Minus30 = CONVERT(NVARCHAR(15), CONVERT(DATE, DATEADD(DAY, -30, GETDATE())))


EXEC ('SELECT ''30'' AS ''' + @today + ''', ''123'' AS ''' + @Minus30 + '''') 

产地:

2015-06-08  2015-05-09
30          123

答案 1 :(得分:1)

最好在检索sql结果的客户端代码中处理。以c#为例:

string sql = String.Format(
    "SELECT [today] as [{0}], [30days ago] as [{1}], [60days ago] as [{2}], [90 days ago] as [{3}] FROM [MyTable]",
         DateTime.Today.ToShortDateString(),
         DateTime.Today.AddDays(-30).ToShortDateString(),
         DateTime.Today.AddDays(-60).ToShortDateString(),
         DateTime.Today.AddDays(-90).ToShortDateString());

如果确实需要,可以将相同的字符串逻辑放入过程sql中,并将其保存到存储过程中。但不要这样做。

答案 2 :(得分:0)

我实际上没有尝试过这样做,但你可以尝试使用@Tanner建议的变量名来使用sp_rename语句:

DECLARE @Minus30 DATE

SELECT @Minus30 = CONVERT(DATE, DATEADD(DAY, -30, GETDATE()))
EXEC sp_rename 'Table.[30days ago]', @Minus30, 'COLUMN'

答案 3 :(得分:0)

如果您正在尝试构建动态日期列的列表,可以使用动态数据透视方法执行此操作:

创建测试表

create table pvtTbl(DateColumns varchar(50),sales money,employeeid int);

insert into pvtTbl 
select cast(getdate() as date) datecol,1249.00 as sales,123 employeeid
UNION
select cast(dateadd(day,-30,getdate()) as date)  datecol,15615.00 as sales,456 employeeid
UNION
select cast(dateadd(day,-60,getdate()) as date) datecol,125583.00 sales,356 employeeid
UNION
select cast(dateadd(day,-90,getdate()) as date) datecol,25571.00 sales,859 employeeid

这部分,我只是创建一个构建数据透视表的示例。但是,您实际上可以将此步骤创建为存储过程中临时表的插入语句,以便每次使用此查询动态构建日期列时更新它:

查询以构建所需日期值的列表

select cast(getdate() as date) datecol
UNION
select cast(dateadd(day,-30,getdate()) as date) datecol
UNION
select cast(dateadd(day,-60,getdate()) as date) datecol
UNION
select cast(dateadd(day,-90,getdate()) as date) datecol

之后,您需要做的就是使用STUFF函数和XML path构建一个动态数据透视表,首先构建一个以逗号分隔的日期值列表,然后动态调整它以将其输出为像这样的列:

动态数据透视表以构建日期列

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.DateColumns)  
            FROM pvtTbl c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT  employeeid,' + @cols + ' from 
            (
                select sales,employeeid,DateColumns
                from pvtTbl
           ) x
            pivot 
            (
                 sum(sales)
                for DateColumns in (' + @cols + ')
            ) p '


execute(@query)

无论如何,如果你将它构建为存储过程,这将是一个好主意。如果您需要更多帮助,请与我们联系。

Demo