转换varchar值'12 / 31 /'

时间:2016-12-08 17:22:12

标签: sql-server type-conversion

我有以下代码:

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时,转换失败。

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

4 个答案:

答案 0 :(得分:2)

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

然后,明确转换并使用try_convert()。所以,我会把它写成:

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

concat()会自动将号码转换为日期。

或者,使用datefromparts()

select datefromparts(accident_year, 12, 31)

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

答案 1 :(得分:1)

可能需要将accidentyear作为varchar

施放
 DECLARE @accidentyear AS INT
 SET @accidentyear = 2016

 SELECT '12/31/' + CAST(@accidentyear AS VARCHAR(4))

答案 2 :(得分:1)

试试这个:

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 

答案 3 :(得分:0)

您从其他用户转发/转换accidentYear到varchar的建议是正确的。这是必要的原因是因为数据类型不同。 '12 / 31'显然是一个字符串。我们也知道AccidentYear是一个int,因为错误信息表明它是一个int。

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

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

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