Existem muitos casos em que 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 internos 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 a 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](http://pics.rumahbengkel.com/files/guides/301/syqk48fbiz.jpg)
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
![](http://pics.rumahbengkel.com/files/guides/301/syqk48fbiz-1.jpg)
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
![](http://pics.rumahbengkel.com/files/guides/301/syqk48fbiz-2.jpg)
Declare @date_time_value varchar (100) = '10 / 1/15 21:02:04 'selecione CONVERT (datetime2, @date_time_value, 3) como UK_Date_Time_Style
![](http://pics.rumahbengkel.com/files/guides/301/syqk48fbiz-3.jpg)
Exemplo 2:
Às vezes, a conversão de string para 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 cast (@date_time_value como datetime2) como date_time_value
![](http://pics.rumahbengkel.com/files/guides/301/syqk48fbiz-4.jpg)
O correto:
Declare @date_time_value varchar (100) = '2019-02-28 21:02:04' selecione elenco (@date_time_value como datetime2) como date_time_value
![](http://pics.rumahbengkel.com/files/guides/301/syqk48fbiz-5.jpg)
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”. Portanto, 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]
![](http://pics.rumahbengkel.com/files/guides/301/syqk48fbiz-6.jpg)
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, é recomendável 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.