2013-11-15 1 views
1

У меня есть ошибка в моем заявлении о датах. Прокомментируйте датированный & бит «Nothing clicked» отлично работает. Я думаю, что это связано с форматом переменных даты.Ошибка SQL Server, DATEDIFF, форматирование полей даты?

сообщение об ошибке ..

Msg 245, Level 16, State 1, Line 2 Конверсия удалось при преобразовании значения VARCHAR 'Ничего не щелкнул' к типу данных междунар.

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

Оба работают благодаря – Mike

+0

'выражение CASE может возвращать только один тип данных.« Ну, вы можете сделать это с определенными типами - возвращаемые типы не должны быть одинаковыми, они просто должны быть совместимыми и иметь право на неявное преобразование. Вопросы для заказа тоже. например 'SELECT CASE WHEN 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 вместо сообщения и пусть приложение обрабатывать этот случай.