SQL Server, ошибка DATEDIFF, форматирование полей даты?

У меня есть ошибка в моем заявлении datediff. Закомментируйте 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

person Mike    schedule 15.11.2013    source источник


Ответы (2)


пытаться:

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 числовым или строковым.

Выражение CASE может возвращать только один тип данных. Он не может возвращать как числовой, так и строковый тип данных. В случае OP он выбирает числовой тип данных, а затем обрабатывает больше строк и обнаруживает, что это должна быть строка, и терпит неудачу. См. раздел Приоритет типов данных.

person KM.    schedule 15.11.2013
comment
A CASE expression can only return one datatype. Ну, вы можете сделать это с определенными типами — возвращаемые типы не обязательно должны быть одинаковыми, они просто должны быть совместимы и подходить для неявного преобразования. Порядок тоже имеет значение. например SELECT CASE WHEN 1 <> 1 THEN 'help' ELSE GETDATE() END; против SELECT CASE WHEN 1 <> 1 THEN GETDATE() ELSE 'help' END; - person Aaron Bertrand; 15.11.2013

Проблема здесь в разных типах данных в выражении 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 вместо сообщения и позволить приложению обрабатывать этот случай.

person Ocaso Protal    schedule 15.11.2013