2016-12-08 125 views
1

我有以下代碼:轉換失敗

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

我假設'AccidentYear'是一個int。所以它試圖將12/31 /添加到該列。看看使用'CONCAT()'或將AccidentYear強制轉換爲varchar – Doolius

+0

用您正在使用的數據庫(推測爲SQL Server)標記您的問題。 –

回答

1

可能需要投accidentyear爲varchar

DECLARE @accidentyear AS INT 
SET @accidentyear = 2016 

SELECT '12/31/' + CAST(@accidentyear AS VARCHAR(4)) 
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 
2

首先,你應該使用ISO標準的日期格式,如YYYYMMDD和YYYY-MM-DD。

然後,明確轉換並使用try_convert()。所以,我會這樣寫:

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

concat()會自動將數字轉換爲日期。

,或者,用datefromparts()

select datefromparts(accident_year, 12, 31) 

這可能是最簡單的解決方案。

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