Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Por que YEAR falharia com um erro de conversão de uma data?


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.

  • use TRY_CONVERT() desde que notei que você está no SQL Server 2012:
    TRY_CONVERT(DATE, RValues) AS FechaFirma