Предполагам, че RValues
е низова колона от някакъв тип по някаква причина. Трябва да поправите това и да съхранявате данни за дата, като използвате тип данни за дата (очевидно в отделна колона от този смесен пакет).
Ако не можете да поправите това, тогава можете да предотвратите това, което Damien описа по-горе чрез:
CASE WHEN ISDATE(RValues) = 1 THEN CONVERT(Date, RValues) END AS FechaFirma
(Което ще направи "датата" NULL
ако SQL Server не може да разбере как да го преобразува в дата.)
Не можете да предотвратите това просто като добавите WHERE
клауза, тъй като SQL Server често ще се опитва да направи опит за преобразуване в SELECT
списък, преди да извършите филтъра (всичко зависи от плана). Също така не можете да принудите реда на операциите, като използвате подзаявка, CTE, подсказки за ред на присъединяване и т.н. Има отворен елемент Connect за този проблем - те са "наясно с него" и "се надяват да го разгледат в бъдеща версия
."
С изключение на CASE израз, който принуждава SQL Server да оцени резултата от ISDATE(), преди да се опита да конвертира (стига да не присъстват агрегати в нито един от клоновете ), можете да:
- изхвърлете филтрираните резултати в #temp таблица и след това изберете от тази #temp таблица и само тогава приложете преобразуването.
- просто върнете низа и го третирайте като дата на клиента и издърпайте ГОДИНА/МЕСец и т.н. части от него там
- просто използвайте манипулиране на низове, за да изтеглите YEAR =LEFT(col,4) и т.н.
-
използвайте
TRY_CONVERT()
тъй като току-що забелязах, че сте на SQL Server 2012:TRY_CONVERT(DATE, RValues) AS FechaFirma