Presumo que
RValues
é uma coluna de string de algum tipo, por algum motivo. Você deve corrigir isso e armazenar dados de data usando um tipo de dados de data (obviamente em uma coluna separada deste saco misto). Se você não pode consertar isso, então você pode evitar o que Damien descreveu acima:
CASE WHEN ISDATE(RValues) = 1 THEN CONVERT(Date, RValues) END AS FechaFirma
(O que tornará a "data"
NULL
se o SQL Server não conseguir descobrir como convertê-lo em uma data.) Você não pode evitar isso simplesmente adicionando um
WHERE
cláusula, porque o SQL Server muitas vezes tentará a conversão no SELECT
list antes de realizar o filtro (tudo depende do plano). Você também não pode forçar a ordem das operações usando uma subconsulta, CTE, dicas de ordem de junção etc. Há um item do Connect aberto sobre esse problema - eles estão "conscientes disso" e "esperam resolvê-lo em uma versão futura
." A menos de uma expressão CASE, que força o SQL Server a avaliar o resultado ISDATE() antes de tentar converter (desde que nenhum agregado esteja presente em nenhuma das ramificações ), você poderia:
- despeje os resultados filtrados em uma tabela #temp e, em seguida, selecione a partir dessa tabela #temp e aplique apenas a conversão.
- basta retornar a string e tratá-la como uma data no cliente e extrair as partes de ANO/MÊS etc. para lá
- basta usar manipulação de string para puxar YEAR =LEFT(col,4) etc.
-
useTRY_CONVERT()
desde que notei que você está no SQL Server 2012:
TRY_CONVERT(DATE, RValues) AS FechaFirma