【问题标题】:Conversion failed when converting the varchar value '12/31/'转换 varchar 值 '12/31/' 时转换失败
【发布时间】:2023-03-31 23:27:01
【问题描述】:

我有以下代码:

declare @StartDate date
declare @EndDate date

set @StartDate='09/01/2016'
set @EndDate='11/30/2016'

SELECT 
    1 AS Segment,
    'C' AS Subsegment,
    100 AS Ent,
    'KPAR' AS LOB,
    'ATLB' AS Cov,
    ClaimNumber AS [Claim#],
    '12/31/'+AccidentYear AS AYDate,
    convert(date, cast(AccountingPeriodDate as date),101) AS EvalDate 

但是我得到一个错误

将 varchar 值 '12/31/' 转换为数据类型 int 时转换失败。

我之前没有收到此错误,我想知道这是由于数据类型更改造成的。

【问题讨论】:

  • 我假设AccidentYear 是一个整数。所以它试图将 12/31/ 添加到该列。查看使用 CONCAT() 或将 AccidentYear 转换为 varchar
  • 用您正在使用的数据库(可能是 SQL Server)标记您的问题。

标签: sql-server type-conversion


【解决方案1】:

首先,您应该使用 ISO 标准日期格式,例如 YYYYMMDD 和 YYYY-MM-DD。

然后,明确说明转换并使用try_convert()。所以,我会这样写:

select try_convert(date, concat(accident_year, '1231'))

concat() 会自动将数字转换为日期。

或者,或者,使用datefromparts()

select datefromparts(accident_year, 12, 31)

这可能是最简单的解决方案了。

【讨论】:

    【解决方案2】:

    可能需要将事故年份转换为 varchar

     DECLARE @accidentyear AS INT
     SET @accidentyear = 2016
    
     SELECT '12/31/' + CAST(@accidentyear AS VARCHAR(4))
    

    【讨论】:

      【解决方案3】:

      试试这个:

      SELECT 1 AS Segment
              ,'C' AS Subsegment
              ,100 AS Ent
              ,'KPAR' AS LOB
              ,'ATLB' AS Cov
              ,ClaimNumber AS [Claim#]
              ,'12/31/'+ CAST(AccidentYear as nvarchar(4)) AS AYDate
              ,convert(date, cast(AccountingPeriodDate as date),101) AS EvalDate 
      

      【讨论】:

        【解决方案4】:

        您从其他用户那里得到的关于将意外年份转换/转换为 varchar 的建议是正确的。这是必要的原因是因为数据类型不同。 '12/31' 显然是一个字符串。我们也知道 AccidentYear 是一个 int,因为错误消息说它是一个 int。

        由于数据类型不同,SQL Server 尝试进行隐式数据类型转换。当 SQL Server 执行此操作时,字符串将转换为整数,然后对其执行数学运算。

        由于无法进行隐式转换,因此您需要改用显式转换。通过使用 cast 或 convert 函数,您正在执行显式转换。

        隐式数据类型转换的规则可以在这里找到:https://msdn.microsoft.com/en-us/library/ms190309.aspx?f=255&MSPPError=-2147217396

        【讨论】:

          猜你喜欢
          • 2013-02-18
          • 1970-01-01
          • 1970-01-01
          • 2013-12-30
          • 2011-05-01
          • 1970-01-01
          相关资源
          最近更新 更多