SQL:将varchar转换为int时出错

时间:2016-02-19 02:26:41

标签: tsql datetime datepart

我有以下转换错误

  

将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

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

2 个答案:

答案 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)

我想你要存档:

您的方案

  1. if @month is null - >搜索2016年的所有价值
  2. if @month is not null - >使用月份和年份搜索所有值
  3. 您的问题:

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

      ... and DATEPART(Year, Holiday) = convert(varchar,2016) + '-' @Month 这是整数和varchar之间的比较

    2. tsql中没有构建功能允许您将月份名称直接转换为整数,因此解决方法是:

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

    3. 我不认为使用case...when...then会在这里工作,因为它在每个场景中的比较都不同,所以我建议使用if...else

    4. 代码示例

      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