我有以下转换错误
将varchar值'2016-October'转换为时转换失败 数据类型int。
在以下声明中:
declare @month varchar(20) = 'October'
select HolidayName, Holiday
from tblHoliday
where PortfolioID = 2 and DATEPART(Year, Holiday) = case when @month is null then 2016 else convert(varchar,2016) + '-' + @Month end
我做错了什么,做这样的事情的正确方法是什么?
答案 0 :(得分:0)
问题出在
DATEPART(Year, Holiday) = case when @month is null then 2016 else convert(varchar,2016) + '-' + @Month end
Datepart(year,holiday)给出一个整数值,但返回整数或字符串的情况。在您的陈述中,2016年不能评估为“2016年10月”
答案 1 :(得分:0)
我想你要存档:
您的方案
@month is null
- >搜索2016年的所有价值@month is not null
- >使用月份和年份搜索所有值您的问题:
@month is not null
时,您的查询将是:
... and DATEPART(Year, Holiday) = convert(varchar,2016) + '-' @Month
这是整数和varchar之间的比较
tsql中没有构建功能允许您将月份名称直接转换为整数,因此解决方法是:
SELECT DATEPART(MM, @month + '01 2000')
我不认为使用case...when...then
会在这里工作,因为它在每个场景中的比较都不同,所以我建议使用if...else
代码示例
declare @month varchar(20) = 'October'
if @month is null begin
select HolidayName, Holiday
from tblHoliday
where PortfolioID = 2
and DATEPART(Year, Holiday) = 2016
end
else begin
select HolidayName, Holiday
from tblHoliday
where PortfolioID = 2
and DATEPART(Year, Holiday) = 2016
and DATEPART(Month, Holiday) = DATEPART(MM, @month + '01 2000')
end