Se você estiver recebendo a mensagem de erro 8116 do SQL Server com texto que diz A data do tipo de dados do argumento é inválida para o argumento 1 da função de substring , é porque você está passando o tipo de dados errado para uma função – neste caso, o
SUBSTRING()
função. Você também pode ver o mesmo erro (Msg 8116) em muitos outros contextos - não está limitado ao
SUBSTRING()
função. Exemplo do erro
Aqui está um exemplo de código que produz o erro:
DECLARE @d date = '2020-03-04';
SELECT SUBSTRING(@d, 1, 4);
Resultado:
Msg 8116, Level 16, State 1, Line 2 Argument data type date is invalid for argument 1 of substring function.
Aqui, passei uma
date
digite como o primeiro argumento para SUBSTRING()
, mas isso não é permitido. A
SUBSTRING()
A função aceita um caractere, binário, texto, ntext ou expressão de imagem como seu primeiro argumento. Se você passar um argumento que não seja um desses tipos aceitos, ocorrerá o erro acima. Como mencionado, isso pode acontecer com outras funções também. De qualquer forma, isso significa que você está passando o tipo de dados errado para a função.
Solução 1
Primeiro, se você estiver passando uma coluna, verifique se acertou na coluna. A solução pode ser uma simples questão de substituir o nome de coluna incorreto pelo nome de coluna correto.
O mesmo se você estiver passando uma variável - verifique se é a variável correta. Você pode resolver esse problema substituindo a variável incorreta pela correta.
Solução 2
Se você tiver certeza de que obteve o nome/variável de coluna correto, uma maneira de corrigir esse erro é converter o argumento para o tipo de dados apropriado.
Por exemplo, poderíamos ajustar o exemplo acima para o seguinte:
DECLARE @d date = '2020-03-04';
SELECT SUBSTRING(CAST(@d AS varchar(10)), 1, 4);
Resultado:
2020
Solução 3
Mas antes de converter qualquer coisa, às vezes vale a pena dar um passo atrás e pensar se há uma maneira mais simples de produzir o resultado desejado.
Por exemplo, no exemplo acima, tudo o que estamos tentando fazer é extrair o ano da data. Nesse caso, talvez seja melhor acabar com o
SUBSTRING()
função completamente, em favor do YEAR()
função:DECLARE @d date = '2020-03-04';
SELECT YEAR(@d);
Resultado:
2020
Outra maneira de fazer isso seria usar o
FORMAT()
função:DECLARE @d date = '2020-03-04';
SELECT FORMAT(@d, 'yyyy');
Resultado:
2020