带日期列的表 - 变量的转换误差



我有一个名为[尾巴]的表,看起来像这样。

Duration  January  February ....
1         0.8782   0.735
2         37.22    0.678
3         0.544    0.47347

我需要做的是根据情况在给定月份的查找值。到目前为止,我有(例如):

DECLARE @monthX Date = '04-01-2016'
Select [Duration],
iif(.....,datename(month,@monthX),....)
From [Tails]

这应该等效于 从[tails]

中选择[持续时间],[4月]

但是我的代码会导致转换错误消息。我尝试了几种不同的方法将变量转换为在线搜索解决方案并无处可寻。

请任何人建议吗?我正在使用SQL Server2014。

非常感谢

您可以动态创建查询,然后使用执行执行:

DECLARE @monthX Datetime
DECLARE @monthS varchar(20)
SET @monthX = '04-01-2016'
SET @monthS = datename(month,@monthX)
DECLARE @SQL varchar(100)
SET @SQL = 'select [Duration], [' + @monthS + '] from [Tails];'
EXECUTE (@SQL)

您无法选择这样的列,但是您可以构造动态SQL查询并使用sp_executesql执行它:

declare @monthX Date = '20160101';
declare @sql nvarchar(max);
set @sql = 'Select [Duration], '+quotename(datename(month,@monthx))+' From [Tails];';
select @sql as sql;
exec sp_executesql @sql;

为此示例执行的查询将是:

Select [Duration], [January] From [Tails];

rextester演示:http://rextester.com/kbas15857

如果要总结整列...使用此列(减去测试的温度数据)

DECLARE @date DATETIME
SET @date = '2/28/17'
DECLARE @monthname VARCHAR(20)
SET @monthname = DATENAME(month, @date)
DECLARE @strSQL varchar(100)
CREATE TABLE #tempTable(duration int, january NUMERIC(28,12), february NUMERIC(28,12))
INSERT INTO #temptable(duration, january, february)
VALUES(1     ,    0.8782  ,0.735)
INSERT INTO #temptable(duration, january, february)
VALUES(2     ,    37.22  ,0.678)
INSERT INTO #temptable(duration, january, february)
VALUES(3     ,    0.544  ,0.47347)

SET @strSQL = 'select SUM(' + @monthname + ') from #tempTable;'
EXECUTE (@strSQL)

DROP TABLE #tempTable

最新更新