2013-10-18 58 views
2

我有以下查詢:SQL服務器日期轉換給錯誤

select A.ACCOUNT_NUM, 
     convert(date, B.EFFECTIVE_DATE, 112) as 'EFFECTIVE_DATE', 
     B.INTEREST_RATE 
from Table1 A 
left join Table2 B 
on A.ACCOUNT_NUM = B.ACCOUNT_NUM 

ACCOUNT_NUM是兩個表中VARCHAR(12),EFFECTIVE_DATE爲varchar(8),格式爲 '20131018' 這是給我'轉換日期和/或時間字符串時轉換失敗'。如果我運行沒有轉換的查詢,它運行良好。

但是我使用ISDATE()檢查了EFFECTIVE_DATE的內容,並且沒有任何問題。 另外,如果我做到以下幾點:

select A.ACCOUNT_NUM, 
     B.EFFECTIVE_DATE, 
     B.INTEREST_RATE 
into #temp 
from Table1 A 
left join Table2 B 
on A.ACCOUNT_NUM = B.ACCOUNT_NUM 


select convert(date, EFFECTIVE_DATE, 112) 
from #temp 

它正確,沒有錯誤列到日期格式轉換。 我錯過了什麼,這讓我發瘋,我確信它非常簡單!

感謝

回答

1

當您將DATE存儲在STRING type fields中時,可能會發生這類問題。可能有一個或兩個字符串不能在列中作爲日期轉換。試試這個與CASE,看看你是否得到的數據。

SELECT A.ACCOUNT_NUM, 
     CASE WHEN ISDATE(B.EFFECTIVE_DATE) THEN CONVERT(DATE, B.EFFECTIVE_DATE, 112) 
      ELSE CONVERT(DATE, '20000101', 112) END AS 'EFFECTIVE_DATE', 
     B.INTEREST_RATE 
FROM Table1 A 
LEFT JOIN Table2 B ON A.ACCOUNT_NUM = B.ACCOUNT_NUM 

如果你得到任何EFFECTIVE_DATE2000-01-01,這意味着你要這些字符串值理清。

此外,您還可以試試下面的查詢找出哪些行導致該問題:

SELECT B.ACCOUNT_NUM, B.EFFECTIVE_DATE 
FROM Table2 B 
WHERE ISDATE(B.EFFECTIVE_DATE) = 0 
+0

我嘗試了這兩個建議,但沒有發現異常。 –

+0

你是否從我的第一個查詢中得到任何錯誤? – Kaf

+0

不是所有返回的日期都是從今年開始如預期的那樣 –

0

我剛剛重新您的架構和運行您的查詢,它工作得很好。毫無疑問,您的Table2.EFFECTIVE_DATE列中的問題是格式錯誤的字符串。

+0

將在EFFECTIVE_DATE列不當格式化字符串不是也給錯誤在第二個代碼塊我張貼有關係嗎?因爲第二個工作正常 –

+0

否,因爲沒有進行轉換,它將VARCHAR值複製到臨時表中的新VARCHAR列。 –

+0

對不起,我的意思是,如果我然後也運行從#temp選擇轉換它工作正常 –