SQL: 将 varchar 转换为 int 时出错

SQL: Error converting varchar to int

我有以下转换错误

Conversion failed when converting the varchar value '2016-October' to data type 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

我做错了什么,做这样的事情的正确方法是什么?

问题在

DATEPART(Year, Holiday) = case when @month is null then 2016 else convert(varchar,2016) + '-' + @Month end 

Datepart(year, holiday) 给你一个整数值,但是 returns 一个整数或一个字符串。在您的声明中,2016 年无法评估为“2016-10 月”

我猜你想归档:

您的场景

  1. if @month is null --> 搜索 2016 年的所有值
  2. if @month is not null --> 搜索所有包含月份和年份的值

您的问题:

  1. @month is not null 时,您的查询将是:

    ... and DATEPART(Year, Holiday) = convert(varchar,2016) + '-' @Month 这是 integer 和 varchar

  2. 之间的比较
  3. tsql 中没有内置函数可让您将月份名称直接转换为整数,因此解决方法是:

    SELECT DATEPART(MM, @month + '01 2000')

  4. 我认为使用 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