SELECT CASE CAST Ошибка преобразования - PullRequest
1 голос
/ 25 марта 2011

Я запрашиваю серверную часть приложения.По какой-то причине разработчик решил использовать NVARCHAR для всех областей.У меня проблема с одним из полей «дата» - каким-то образом оно заполнилось «97630886».Есть сопутствующее поле «время», и для моего запроса я пытаюсь объединить и обработать результаты как DATETIME.Я пытаюсь использовать оператор CASE, но он выдает ошибку: «Преобразование типа данных char в тип данных datetime привело к значению datetime вне диапазона».Видимо все условия оцениваются?Есть ли способ, которым я могу переписать свой оператор SELECT для обработки этого?

SELECT CASE 
WHEN LOG_DATE IS NULL AND LOG_TIME IS NULL THEN NULL 
WHEN LOG_DATE IS NULL THEN LOG_TIME 
WHEN LOG_TIME IS NULL THEN LOG_DATE 
WHEN ISDATE(LOG_DATE) = 0 OR ISDATE(LOG_TIME) = 0 THEN LOG_DATE + ' ' + LOG_TIME 
ELSE CAST(LOG_DATE + ' ' + LOG_TIME AS DATETIME)
END AS [LogDateTime] 
FROM ...

1 Ответ

3 голосов
/ 25 марта 2011

Нельзя смешивать типы данных в выражениях CASE (или, по крайней мере, не позаботиться о том, чтобы они неявно приводили OK)общий тип данных выражения должен быть

SELECT CASE WHEN 1=1 THEN 'not-a-date' ELSE getdate() END

. Приведенный выше datetime имеет более высокий приоритет, чем char, поэтому он неявно преобразует строку в дату, которая не удалась.

однако, поскольку sql_variant имеет более высокий приоритет

SELECT CASE WHEN 1=1 THEN cast('not-a-date' as sql_variant) ELSE getdate() END

Таким образом, вы можете возвращать несколько смешанных типов данных таким образом (хотя я не уверен, насколько просто работать с sql_variant)

Кроме этого, вы можете вернуть NULL для недопустимых значений даты вместо того, чтобы возвращать бессмысленные данные или преобразовать все в строку, если вы должны ее вернуть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...