我有以下代码:
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时,转换失败。
之前我没有收到此错误,并且想知道这是由于数据类型的更改。
答案 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