2015-06-08 46 views
0

列[日],[30天前],[60天前],[89天前]的日期動態列

我有一個表將在今天來回我提供的銷售數量和30天前,60幾天前和90天前,

但我的問題是要弄清楚實際日期是60天前。 我想更新我的劇本,而不是在60天前展示給我,但是讓我看看60天前的實際日期。我想讓我的專欄動態化,以便於我在90天前獲得實際日期。

任何人都可以幫助我嗎?

請記住,這是一個長的腳本和10列,我想改變每列以顯示實際日期而不是90天前。

+1

使用DATEADD。 https://msdn.microsoft.com/en-us/library/ms186819.aspx –

+0

您現在如何構建查詢? –

+0

你需要的是一個動態的支點。 – FutbolFan

回答

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 
+0

我認爲OP想動態改變「Minus30」的名字。 –

+0

我只需要動態的方式來反映今天的列名稱。我很滿意列中的數據,但我想要一個動態的列名稱,在數據刷新時保持更新。 – Afrah

+0

@Afrah做了我剛編輯過的變量方法,讓你做你想做的事情?每次運行語句時,都會使用最新值進行更新。 – Tanner

0

我還沒有真正嘗試過這樣做,但你可以嘗試使用的變量名@Tanner建議使用sp_rename聲明:

DECLARE @Minus30 DATE 

SELECT @Minus30 = CONVERT(DATE, DATEADD(DAY, -30, GETDATE())) 
EXEC sp_rename 'Table.[30days ago]', @Minus30, 'COLUMN' 
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,並保存到存儲過程。但不要這樣做。

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先建立一個逗號日期值的分隔列表,然後動態地轉動它輸出爲構建一個動態透視你的這樣的列:

動態Pivot構建日期列

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