专栏[今天],[30天前],[60天前],[90天前]
我有一张桌子,它将为我提供今天和30天前,60天前和90天前的销售号码,
但我的问题是弄清楚60天前的实际日期。 我想更新我的脚本不是60天前给我看的,而是为了告诉我60天前的实际日期。我想让我的列动态,所以我得到90天前的实际日期。
有人可以帮我吗?
请记住这是一个很长的脚本和10列,我想更改每一列以显示实际日期,而不是90天前。
答案 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)
无论如何,如果你将它构建为存储过程,这将是一个好主意。如果您需要更多帮助,请与我们联系。