列[日],[30天前],[60天前],[89天前]的日期動態列
我有一個表將在今天來回我提供的銷售數量和30天前,60幾天前和90天前,
但我的問題是要弄清楚實際日期是60天前。 我想更新我的劇本,而不是在60天前展示給我,但是讓我看看60天前的實際日期。我想讓我的專欄動態化,以便於我在90天前獲得實際日期。
任何人都可以幫助我嗎?
請記住,這是一個長的腳本和10列,我想改變每列以顯示實際日期而不是90天前。
列[日],[30天前],[60天前],[89天前]的日期動態列
我有一個表將在今天來回我提供的銷售數量和30天前,60幾天前和90天前,
但我的問題是要弄清楚實際日期是60天前。 我想更新我的劇本,而不是在60天前展示給我,但是讓我看看60天前的實際日期。我想讓我的專欄動態化,以便於我在90天前獲得實際日期。
任何人都可以幫助我嗎?
請記住,這是一個長的腳本和10列,我想改變每列以顯示實際日期而不是90天前。
您可以使用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
我還沒有真正嘗試過這樣做,但你可以嘗試使用的變量名@Tanner建議使用sp_rename聲明:
DECLARE @Minus30 DATE
SELECT @Minus30 = CONVERT(DATE, DATEADD(DAY, -30, GETDATE()))
EXEC sp_rename 'Table.[30days ago]', @Minus30, 'COLUMN'
這是在客戶端代碼檢索最好的處理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,並保存到存儲過程。但不要這樣做。
如果你正在試圖建立動態數據列的列表,你可以做到這一點使用動態透視方法是這樣的:
創建測試表
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)
無論如何,這將是一個好主意,如果你建立這個作爲一個存儲過程。讓我知道你是否需要任何幫助。
使用DATEADD。 https://msdn.microsoft.com/en-us/library/ms186819.aspx –
您現在如何構建查詢? –
你需要的是一個動態的支點。 – FutbolFan