A conversão falhou ao converter data e / ou hora da cadeia de caracteres ao inserir datetime

Eu estava tentando criar uma tabela como segue,

create table table1(date1 datetime,date2 datetime); 

Primeiro tentei inserir valores como abaixo,

 insert into table1 values('21-02-2012 6:10:00 PM','01-01-2001 12:00:00 AM'); 

Deu erro dizendo,

Não é possível converter varchar para datetime

Então eu tentei abaixo do formato como um dos post sugerido pelo nosso stackoverflow,

 insert into table1 values(convert(datetime,'21-02-2012 6:10:00 PM',5) ,convert(datetime,'01-01-2001 12:00:00 AM',5)); 

Mas ainda estou recebendo o erro dizendo:

A conversão falhou ao converter data e / ou hora da cadeia de caracteres

Alguma sugestão?

Há muitos formatos suportados pelo SQL Server – consulte os Manuais Online do MSDN no CAST e no CONVERT . A maioria desses formatos depende das configurações que você tem – portanto, essas configurações podem funcionar algumas vezes – e às vezes não.

A maneira de resolver isso é usar o formato de data ISO-8601 (ligeiramente adaptado) que é suportado pelo SQL Server – esse formato sempre funciona – independentemente do idioma do SQL Server e das configurações de formato de data.

O formato ISO-8601 é suportado pelo SQL Server vem em dois sabores:

  • YYYYMMDD para apenas datas (sem parte do tempo); nota aqui: sem traços! isso é muito importante! YYYY-MM-DD NÃO é independente das configurações de formato de data no seu SQL Server e NÃO funcionará em todas as situações!

ou:

  • YYYY-MM-DDTHH:MM:SS para datas e horas – observe aqui: esse formato tem traços (mas eles podem ser omitidos) e um T fixo como delimitador entre a parte de data e hora de seus DATETIME .

Isso é válido para o SQL Server 2000 e mais recente.

Então, no seu caso concreto – use essas seqüências de caracteres:

 insert into table1 values('2012-02-21T18:10:00', '2012-01-01T00:00:00'); 

e você deve estar bem (nota: você precisa usar o formato internacional de 24 horas em vez de formato AM / PM de 12 horas para isso).

Alternativamente : se você está no SQL Server 2008 ou mais recente, você também pode usar o tipo de dados DATETIME2 (em vez de simples DATETIME ) e seu INSERT atual funcionaria sem problemas! 🙂 O DATETIME2 é muito melhor e muito menos exigente em conversões – e são os tipos de dados de data / hora recomendados para o SQL Server 2008 ou mais recente.

 SELECT CAST('02-21-2012 6:10:00 PM' AS DATETIME2), -- works just fine CAST('01-01-2012 12:00:00 AM' AS DATETIME2) -- works just fine 

Não me pergunte por que todo este tópico é tão complicado e um tanto confuso – é assim que é. Mas com o formato YYYYMMDD , você deve estar bem para qualquer versão do SQL Server e para qualquer configuração de linguagem e data no seu SQL Server.

A conversão no servidor SQL falha, às vezes, não por causa dos formatos de Data ou Hora usados. É simplesmente porque você está tentando armazenar dados errados que não são aceitáveis ​​para o sistema.

Exemplo:

Create Table MyTable (MyDate);

Insert Into MyTable(MyDate) Values ('2015-02-29');

O servidor SQL lançará o seguinte erro:

Conversion failed when converting date and/or time from character string.

A razão para este erro é simplesmente que não existe essa data (Fev-29) no ano (2015).

Resposta simples – 5 é italiano “yy” e 105 é italiano “yyyy”. Assim sendo:

 SELECT convert(datetime,'21-02-12 6:10:00 PM',5) 

funcionará corretamente, mas

 SELECT convert(datetime,'21-02-12 6:10:00 PM',105) 

vai dar erro.

Da mesma forma,

 SELECT convert(datetime,'21-02-2012 6:10:00 PM',5) 

vai dar erro, onde como

 SELECT convert(datetime,'21-02-2012 6:10:00 PM',105) 

vai funcionar.

Sempre que possível, deve-se evitar literais de data / hora específicos da cultura .

Existem alguns formatos seguros para fornecer uma data / hora como literal:

Todos os exemplos para 2016-09-15 17:30:00

ODBC (meu favorito, pois é tratado como o tipo real imediatamente)

  • {ts'2016-09-15 17:30:00'} – carimbo de hora
  • {d'2016-09-15'} – Apenas datas
  • {t'17:30:00'} – Somente horário

ISO8601 (o melhor para todos os lugares )

  • '2016-09-15T17:30:00' esteja ciente do T no meio!

Unseperated (pequeno risco de ser mal interpretado como número)

  • '20160915' somente para data pura

É bom ter em mente: datas inválidas tendem a aparecer com erros estranhos

  • Não há 31 de junho ou 30 de fevereiro …

Mais uma razão para erros de conversão estranhos: Ordem de execução!

O SQL-Server é bem conhecido para fazer as coisas em uma ordem de execução que pode não ser esperada. Sua declaração escrita parece que a conversão é feita antes que algum tipo de ação relacionada ocorra, mas o mecanismo decide – por que nunca – fazer a conversão em uma etapa posterior.

Aqui está um ótimo artigo explicando isso com exemplos: Rusano.com: “t-sql-funções-não-implica uma certa ordem de execução” e aqui está a questão relacionada .

Basta atualizar o formato de data como abaixo

 yyyy-MM-dd hh:MM:ss 

Isso resolve o problema para mim e funciona bem

a melhor maneira é esse código

 "select * from [table_1] where date between convert(date,'" + dateTimePicker1.Text + "',105) and convert(date,'" + dateTimePicker2.Text + "',105)" 
 convert(datetime2,((SUBSTRING( ISNULL(S2.FechaReal,e.ETA),7,4)+'-'+ SUBSTRING( ISNULL(S2.FechaReal,e.ETA),4,2)+'-'+ SUBSTRING( ISNULL(S2.FechaReal,e.ETA),1,2) + ' 12:00:00.127'))) as fecha, 

Por favor, tente isso.

O SQL Server espera datas no formato MM / DD / AAAA, se o inglês estiver definido como seu idioma padrão. Aqui estou salvando o valor de datepicker para o database sql2008. Meu tipo de campo é datetime em database.dpdob é meu nome de datepicker.

  Dim test = dpdob.Text.Replace("-", "/") Dim parts As String() = test.Split(New Char() {"/"c}) Dim firstPart As String = parts(0) Dim thirdPart As String = parts(2) Dim secondPart As String = parts(1) Dim test1 = secondPart + "/" + firstPart + "/" + thirdPart Dim dob = test1 

Agora use o dob na sua consulta de inserção.

O formato datetime realmente executado no sql server é

 yyyy-mm-dd hh:MM:ss 

Você pode tentar este código

 select (Convert(Date, '2018-04-01')) 

Eu tive esse problema ao tentar concatenar getdate() em uma seqüência de caracteres que eu estava inserindo em um campo nvarchar.

Eu fiz alguns casting para contornar isso:

  INSERT INTO [SYSTEM_TABLE] ([SYSTEM_PROP_TAG],[SYSTEM_PROP_VAL]) VALUES ( 'EMAIL_HEADER', '

111 Any St.
Anywhere, ST 11111


' + CAST(CAST(getdate() AS datetime2) AS nvarchar) + '


' )

Esse é um exemplo higienizado. A parte chave disso é:

...' + CAST(CAST(getdate() AS datetime2) AS nvarchar) + '...

Casted a data como datetime2 , em seguida, como nvarchar para concatená-la.

definir cultura para inglês do arquivo web.config

   

por exemplo, se você definir a cultura para o árabe o tempo será

22/09/2017 02:16:57 ص

e você obtém o erro: Falha na conversão ao converter data e / ou hora da cadeia de caracteres ao inserir datetime