【问题标题】:SQL: Error converting varchar to intSQL:将 varchar 转换为 int 时出错
【发布时间】:2016-02-19 02:26:41
【问题描述】:
我有以下转换错误
将 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
我做错了什么,做这种事情的正确方法是什么?
【问题讨论】:
-
-
case 表达式返回的各种值必须都是兼容的数据类型,即相同或支持隐式转换的数据类型。遗憾的是,您对整数和字符串的选择不兼容。请注意VarChar 的默认长度是1。您可能想要指定更大的东西,例如VarChar(4).
标签:
tsql
datetime
datepart
【解决方案1】:
我猜你想存档:
你的场景
- if
@month is null --> 搜索 2016 年的所有值
- if
@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
【解决方案2】:
问题出在
DATEPART(Year, Holiday) = case when @month is null then 2016 else convert(varchar,2016) + '-' + @Month end
Datepart(year, holiday) 给你一个整数值,但是 case when 返回一个整数或字符串。在您的声明中,2016 年不能评估为 '2016-October'