2013-11-15 104 views
1

我在我的datediff聲明中有錯誤。評論出來datediff &'沒有點擊'位工作正常。我認爲它與日期變量的格式有關。SQL Server,DATEDIFF錯誤,日期字段的格式?

錯誤消息..

消息245,級別16,狀態1,第2行轉換爲varchar值 '沒有點擊' 爲數據類型int時 轉換失敗。

select 

case 
when stVs.DateLastAction is null then 'Nothing clicked' 
else DATEDIFF(MI,StVs.DateSessionStarted,stVs.DateLastAction) 
end as test 

From Stats_VisitorSessions StVs 
+1

[請不要使用'MI'這樣的懶惰速記 - 只是拼寫出'MINUTE',這並不難](http://sqlblog.com/blogs/aaron_bertrand/archive/2011/09/20/bad -habits到使用-速記與 - 日期 - 時間 - operations.aspx踢)。 –

回答

5

嘗試:

select 
case 
when stVs.DateLastAction is null then 'Nothing clicked' 
else CONVERT(varchar(30),DATEDIFF(MI,StVs.DateSessionStarted,stVs.DateLastAction)) 
-- ^^^^^^^^^^^^^^^^^^^^              ^
end as test 

From Stats_VisitorSessions StVs 

TSQL是有一個很難解決,如果test結果集列是數字或字符串。

A CASE表達式只能返回一個數據類型。它不能返回數字和字符串數據類型。在OP的情況下,它決定一個數字數據類型,然後處理更多的行,並發現它需要是一個字符串,並且失敗。見Data type precedence

+0

Both work thanks – Mike

+0

'一個CASE表達式只能返回一個數據類型.'好吧,您可以使用某些類型 - 返回的類型不必是相同的,只需要兼容並且有資格進行隱式轉換。訂單也很重要。例如'SELECT CASE當1 <> 1 THEN'help'ELSE GETDATE()END;'vs.'SELECT CASE when 1 <> 1 then GETDATE()ELSE'help'END; –

3

這裏的問題是CASE表達式中的不同數據類型。添加CAST,一切都應該工作:

select 

case 
when stVs.DateLastAction is null then 'Nothing clicked' 
else CAST(DATEDIFF(MI,StVs.DateSessionStarted,stVs.DateLastAction) AS varchar) 
end as test 

From Stats_VisitorSessions StVs 

另一種選擇是重返NULL的消息,而不是讓應用程序處理這種情況。