Como corrigir o erro 'Falha de conversão ao converter data e / ou hora da sequência de caracteres'?



Experimente Nosso Instrumento Para Eliminar Problemas

Há muitos casos em que as datas e horas não aparecem no formato que você deseja, nem uma saída de consulta atende às necessidades dos visualizadores. Existem vários recursos integrados do SQL Server para formatar a string de data de acordo com sua necessidade, mas para que a string seja interpretada pelo SQL Server e para evitar erros de conversão, ela deve estar em um formato adequado. Quando tentamos converter a data ou hora da cadeia de caracteres, às vezes surge um erro. “A conversão falhou ao converter a data e / ou hora da sequência de caracteres.”



erro de conversão de data e hora

Figura 1: Erro de conversão de data e / ou hora da sequência de caracteres



O erro mencionado acima normalmente surge quando o literal de data não é adequado e não pode ser convertido da string em DateTime ou data. Esse erro ocorre devido a vários motivos, que discutiremos em detalhes junto com o conjunto de soluções.



Exemplo 1:

Reino Unido A notação de data e hora exibe a data usando o formato dia-mês-ano (10 de janeiro de 2015 ou 01/10/2015), que podemos obter usando a função “converter” do recurso interno do SQL Server com estilo de formatação 103

Aqui, no exemplo abaixo, podemos ver que a string de data fornecida está no formato errado. Primeiro, ele fornece o mês, depois os dias e o último ano, o que está errado e não pode ser interpretado pelo SQL Server, o que resulta em um erro. O formato correto para a conversão de data no estilo do Reino Unido usando o estilo de data “103” é “dd / mm / aaaa”.

Formato incorreto:

Declare @date_time_value varchar (100) = '10 / 16/2015 21:02:04 'selecione CONVERT (datetime2, @date_time_value, 103) como UK_Date_Time_Style

Figura 2: Formato de data errado, resultando em erro



Formato correto:

O formato de data britânico e francês é 103 = “dd / mm / aaaa” ou 3 = ”dd / mm / aa”. Aqui 103 e 3 são estilos de data.

Declare @date_time_value varchar (100) = '10 / 1/15 21:02:04 'selecione CONVERT (datetime2, @date_time_value, 103) como Date_Time_Style

Figura 3: Formato de data correto com estilo de data “dd / mm / aaaa” britânico / francês

Declare @date_time_value varchar (100) = '10 / 1/15 21:02:04 'selecione CONVERT (datetime2, @date_time_value, 3) como UK_Date_Time_Style

Figura 4: Formato de data correto com estilo de data britânico / francês “dd / mm / aa”

Exemplo 2:

Às vezes, a conversão de string até a data no servidor SQL resulta em erro, não por causa dos formatos de data ou hora usados, mas porque você está tentando armazenar informações incorretas que não são aceitáveis ​​para o esquema.

Data errada:

A razão para o seguinte erro é meramente que no ano de 2019 não existe uma data como “29 de fevereiro” porque não é um ano bissexto.

Declare @date_time_value varchar (100) = '2019-02-29 21:02:04' selecione o cast (@date_time_value como datetime2) como date_time_value

Figura 5: Erro levantado porque 2019 não é um ano bissexto, portanto, não tem 29 de fevereiro como data

Correto:

Declare @date_time_value varchar (100) = '2019-02-28 21:02:04' selecione elenco (@date_time_value como datetime2) como date_time_value

Figura 6: data correta

Formato de data ISO 8601:

Embora vários formatos estejam disponíveis para manipular valores de data, ao trabalhar para uma massa global / internacional, pode ser um problema de usabilidade escolher uma representação de data e hora. Portanto, literais de data / hora específicos da cultura devem ser evitados. Se considerarmos esta data “03/08/2018”, ela será interpretada de diferentes maneiras em diferentes regiões do mundo.

  • No estilo do Reino Unido, é interpretado como “8 de março de 2018”
  • No estilo europeu, é interpretado como “3 de agosto de 2018”

Felizmente, existe uma alternativa no formato de data internacional desenvolvido pela ISO. O formato ISO 8601 do padrão global “AAAA-MM-DDThh: mm: ss” é uma opção mais independente do idioma para literais de string e aborda todos esses problemas. Considerando que “aaaa” é o ano, “mm” é o mês e “dd” é o dia. Portanto, a data “8 de março de 2018” no formato ISO internacional é escrita como “2018-03-08”. Assim, o formato ISO é a melhor escolha para representação de data.

Declare @date_time_value varchar (100) = '2019-03-28 21:02:04' select convert (datetime2, @ date_time_value, 126) como [aaaa-mm-ddThh: mi: ss.mmm]

Figura 7: Formato de data do Padrão Internacional ISO 8601

Recomendações:

Esperançosamente, este artigo ajudará a aliviar a confusão que tenho visto com frequência na comunidade sobre valores de data / hora. No entanto, é recomendado que nunca armazene datas em colunas do tipo texto (varchar, char, nvarchar, nchar ou texto). Sempre armazene o valor da data em DATE, DATETIME e, de preferência, DATETIME2 (fornece mais precisão) colunas do tipo e deixe a formatação das informações de data para a camada de interface do usuário em vez de ser recuperado do banco de dados.

2 minutos lidos