【问题标题】: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】:

我猜你想存档:

你的场景

  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 这是整数和varchar之间的比较

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

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

  3. 我不认为在这里使用 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'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-27
      • 2013-07-21
      • 1970-01-01
      • 1970-01-01
      • 2016-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多