我有以下代码:
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
>