Jag antar att RValues
är en strängkolumn av någon typ, av någon anledning. Du bör fixa det och lagra datumdata med en datumdatatyp (uppenbarligen i en separat kolumn än den här blandade väskan).
Om du inte kan fixa det kan du förhindra det som Damien beskrev ovan genom att:
CASE WHEN ISDATE(RValues) = 1 THEN CONVERT(Date, RValues) END AS FechaFirma
(Vilket gör "datumet" NULL
om SQL Server inte kan ta reda på hur man konverterar det till ett datum.)
Du kan inte förhindra detta helt enkelt genom att lägga till en WHERE
sats, eftersom SQL Server ofta försöker att försöka konvertera i SELECT
lista innan du utför filtret (allt beror på planen). Du kan inte heller tvinga fram operationsordningen genom att använda en underfråga, CTE, anslutningsordertips, etc. Det finns ett öppet Connect-objekt om det här problemet - de är "medvetna om det" och "hoppas kunna lösa det i en framtida version
."
Kort om ett CASE-uttryck, vilket tvingar SQL Server att utvärdera ISDATE()-resultatet innan man försöker konvertera (så länge det inte finns några aggregat i någon av grenarna ), kan du:
- dumpa de filtrerade resultaten i en #temp-tabell och välj sedan från den #temp-tabellen och använd endast konverteringen då.
- Skicka bara tillbaka strängen och behandla den som ett datum på klienten, och dra ut delar av ÅR/MÅNAD etc. ur den där
- använd bara strängmanipulation för att dra YEAR =LEFT(col,4) etc.
-
använd
TRY_CONVERT()
eftersom jag precis märkte att du är på SQL Server 2012:TRY_CONVERT(DATE, RValues) AS FechaFirma