转换 varchar 值时转换失败'12/31/'



我有以下代码:

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。

时失败

我以前没有遇到这个错误,并且想知道这是由于数据类型的变化。

首先,您应该使用ISO标准日期格式,例如yyyymmdd和yyyy-mm-dd。

然后,要明确有关转换并使用try_convert()。所以,我将其写为:

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

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

或者,请使用datefromparts()

select datefromparts(accident_year, 12, 31)

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

可能需要以varchar

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

尝试以下:

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 

您从其他用户获得的建议将偶然的年度转换为varchar是正确的。这是必要的原因是因为数据类型不是相同的。'12/31'显然是一个字符串。我们也知道偶然的是一个INT,因为错误消息说这是一个int。

由于数据类型不同,因此SQL Server尝试使用隐式数据类型转换。当SQL Server执行此操作时,字符串将转换为整数,然后在其上执行数学。

由于不可能进行隐式转换,因此您需要使用显式转换。通过使用铸件或转换功能,您正在进行明确的转换。

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

>

最新更新