Předpokládám, že RValues
je z nějakého důvodu řetězcový sloupec nějakého typu. Měli byste to opravit a ukládat data data pomocí datového typu data (samozřejmě v samostatném sloupci, než je tato směs).
Pokud to nemůžete opravit, můžete zabránit tomu, co Damien popsal výše:
CASE WHEN ISDATE(RValues) = 1 THEN CONVERT(Date, RValues) END AS FechaFirma
(Čímž bude „datum“ NULL
pokud SQL Server nemůže přijít na to, jak jej převést na datum.)
Tomu nezabráníte jednoduše přidáním WHERE
klauzule, protože SQL Server se často pokusí o převod v SELECT
seznam před provedením filtru (vše závisí na plánu). Pořadí operací také nemůžete vynutit pomocí poddotazu, CTE, nápověd k objednávce spojení atd. O tomto problému existuje otevřená položka Connect – „uvědomují si to“ a „doufají, že se jím budou zabývat v budoucí verzi
."
Krátký výraz CASE, který nutí SQL Server vyhodnotit výsledek ISDATE() před pokusem o převod (pokud v žádné z větví nejsou přítomny žádné agregáty ), můžete:
- uložte filtrované výsledky do #temp tabulky a následně vyberte z této #temp tabulky a teprve poté použijte převod.
- prostě vraťte řetězec a zacházejte s ním jako s datem na klientovi a vytáhněte z něj části ROK/MĚSÍC atd.
- prostě pomocí manipulace s řetězcem vytáhněte YEAR =LEFT(sloupec,4) atd.
-
použijte
TRY_CONVERT()
protože jsem si právě všiml, že používáte SQL Server 2012:TRY_CONVERT(DATE, RValues) AS FechaFirma