Ik neem aan dat RValues
is om de een of andere reden een stringkolom van een bepaald type. U moet dat oplossen en datumgegevens opslaan met een datumgegevenstype (uiteraard in een aparte kolom dan deze allegaartje).
Als je dat niet kunt oplossen, kun je voorkomen wat Damien hierboven beschreef door:
CASE WHEN ISDATE(RValues) = 1 THEN CONVERT(Date, RValues) END AS FechaFirma
(Hierdoor wordt de "datum" NULL
als SQL Server er niet achter kan komen hoe het naar een datum moet worden geconverteerd.)
Je kunt dit niet voorkomen door simpelweg een WHERE
. toe te voegen clausule, omdat SQL Server vaak zal proberen de conversie te proberen in de SELECT
lijst voordat u het filter uitvoert (alles hangt af van het plan). U kunt de volgorde van bewerkingen ook niet forceren door een subquery, CTE, join-orderhints, enz. te gebruiken. Er is een open Connect-item over dit probleem - ze zijn "op de hoogte" en "hopen het in een toekomstige versie aan te pakken
."
Kort van een CASE-expressie, die SQL Server dwingt om het ISDATE()-resultaat te evalueren voordat wordt geprobeerd om te converteren (zolang er geen aggregaten aanwezig zijn in een van de takken ), kunt u:
- dump de gefilterde resultaten in een #temp-tabel en selecteer vervolgens uit die #temp-tabel, en pas dan alleen de conversie toe.
- geef gewoon de string terug, en behandel het als een datum op de client, en trek daar JAAR/MAAND enz. delen uit
- gebruik gewoon stringmanipulatie om YEAR =LEFT(col,4) etc. te trekken.
-
gebruik
TRY_CONVERT()
aangezien ik net heb gemerkt dat je SQL Server 2012 gebruikt:TRY_CONVERT(DATE, RValues) AS FechaFirma