Falha na conversão ao converter data e / ou hora da cadeia de caracteres ao inserir data e hora

164

Eu estava tentando criar uma tabela da seguinte maneira:

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');

Ele deu erro dizendo:

Não é possível converter varchar para datetime

Tentei o formato abaixo como uma das postagens sugeridas 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:

Falha na conversão ao converter data e / ou hora da cadeia de caracteres

Alguma sugestão?

Mari
fonte
2
@Damien_The_Unbeliever como você disse, eu já me referi a este post stackoverflow.com/questions/12957635/… antes de fazer esta pergunta. Eles nos pediram para usar 'inserir valores da tabela1 (data de aprovação) (convert (datetime, '18 -06-12 22:34:09 PM', 5)); ' mas ele não funciona
Mari

Respostas:

163

Existem muitos formatos suportados pelo SQL Server - consulte os Manuais Online do MSDN no CAST e CONVERT . A maioria desses formatos depende das configurações que você possui - 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) suportado pelo SQL Server - esse formato funciona sempre - independentemente das configurações de idioma e formato de data do SQL Server.

O formato ISO-8601 é suportado pelo SQL Server e tem dois tipos:

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

ou:

  • YYYY-MM-DDTHH:MM:SSpara datas e horas - observe aqui: esse formato possui hífens (mas eles podem ser omitidos) e um Tdelimitador fixo entre a parte de data e hora do seu DATETIME.

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

Portanto, no seu caso concreto - use estas strings:

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

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

Como alternativa : se você estiver no SQL Server 2008 ou mais recente, também poderá usar o DATETIME2tipo de dados (em vez de simples DATETIME) e sua corrente INSERTfuncionaria sem problemas! :-) DATETIME2é muito melhor e muito menos exigente nas conversões - e são os tipos de dados de data / hora recomendados para o SQL Server 2008 ou mais recentes.

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 esse tópico é tão complicado e um tanto confuso - é assim que é. Mas com o YYYYMMDDformato, você deve se adequar a qualquer versão do SQL Server e a qualquer configuração de idioma e formato de data no SQL Server.

marc_s
fonte
1
Apenas como observação, a transmissão como DATETIME2 também funciona com 'AAAA-MM-DDTHH: MM: SSZ' (observe 'Z' - hora do Zulu no final para indicar o carimbo de data / hora UTC). Eu tenho esse erro ao tentar inserir '2013-12-16T17: 21: 26Z' no campo de data e hora. Apenas para esclarecer, a ISO 8601 é parcialmente suportada. Ele não suporta o tempo Zulu, apesar de ter sido mencionado na documentação. Provavelmente é um cenário que ainda não tive tempo de descobrir, mas, caso alguém tenha o mesmo problema, lembre-se disso.
Michał
3
Posso confirmar que o formato de data 'AAAAMMDD' funciona bem, tentei no SQL Server 2014, como uma maneira de especificar uma data literal em uma cláusula WHERE. Muitos tanques para @marc_s
Giorgio Barchiesi
1
A coisa DATETIME2 funcionou para mim. No meu caso, eu estava importando um script de banco de dados de um SQLServer em inglês para uma versão em espanhol, portanto sempre o mesmo erro. Eu simplesmente substituí no script todas as ocorrências "como DATETIME" para "como DATETIME2" e o problema foi resolvido.
Alejandro del Río
24

Às vezes, a conversão no servidor SQL não ocorre devido aos formatos de data ou hora usados. É apenas porque você está tentando armazenar dados incorretos que não são aceitáveis ​​pelo 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.

O motivo desse erro é simplesmente que não existe essa data (29 de fevereiro) no ano (2015).

Ashraf Abusada
fonte
2
"A razão para esse erro é simplesmente que não existe essa data (29 de fevereiro) no ano (2015)" Essa foi exatamente a razão pela qual eu estava recebendo esse erro. Essa resposta leva em consideração a causa mais comum desse erro, que as outras respostas não.
FirstFraktal 4/09/15
1
Importei dados de uma planilha do Excel em que os valores nulos realmente tinham "NULL" na célula. Isso foi definido como uma cadeia de caracteres "Nulo" na tabela do banco de dados, portanto, estava tentando converter a cadeia de caracteres "Nulo" em um datetime. Deveria ter esvaziado as células "NULL" no Excel. Eu sou um idiota: /
karol
17

Resposta simples - 5 é italiano "aa" e 105 é italiano "aaaa". Portanto:

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)

dará erro.

Da mesma forma,

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

dará erro, onde

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

vai funcionar.

Raj
fonte
8

Basta atualizar o formato da data como abaixo

yyyy-MM-dd hh:MM:ss

Resolve o problema para mim e funciona bem

Pronab Roy
fonte
2
Por favor, leia as outras respostas já fornecidas. Este formato funciona apenas para você devido à sua DATEFORMATconfiguração de sessão . Verifique isso executando SET DATEFORMAT MDY;SELECT CAST('2017-08-07 00:00:00' AS datetime); SET DATEFORMAT DMY;SELECT CAST('2017-08-07 00:00:00' AS datetime);. Funcionará de forma confiável se você adicionar um Tseparador ( yyyy-MM-ddTHH:mm:ss).
Dan Guzman
1
Muito obrigado sim você está certo que resolve meu problema e eu li as outras respostas dadas aqui
Pronab Roy
8

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 data / hora
  • {d'2016-09-15'} --Data apenas
  • {t'17:30:00'} --Tempo apenas

ISO8601 (o melhor para qualquer lugar )

  • '2016-09-15T17:30:00'- esteja ciente do Tmeio!

Não separado (pequeno risco de ser mal interpretado como número)

  • '20160915' - apenas para data pura

É bom lembrar: 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!

É sabido que o SQL-Server faz as coisas em uma ordem de execução que não se poderia esperar. Sua declaração por escrito parece que a conversão é feita antes alguma ação relacionada ao tipo 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-functions-não-implica-uma-certa-ordem-de-execução" e aqui está a questão relacionada .

Shnugo
fonte
3

a melhor maneira é esse código

"select * from [table_1] where date between convert(date,'" + dateTimePicker1.Text + "',105) and convert(date,'" + dateTimePicker2.Text + "',105)"
Ahmed Soliman
fonte
2
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,
ARLE ANDINO
fonte
1
Se você usar backticks, em vez de espaços iniciais, terá quebra de linha.
Jesse W no Z - Abandonado em
2

O formato de data e hora realmente executado no servidor sql é

yyyy-mm-dd hh:MM:ss
Bhavya Dhiman
fonte
1
Não, isso não é verdade (além da incompatibilidade de me M). Leia o comentário de Dan Guzman na resposta de Pronab Roy. E leia as outras respostas aqui ...
Shnugo 25/11
2

Por favor, tente isso.

O SQL Server espera datas no formato MM / DD / AAAA, se o inglês estiver definido como idioma padrão. Aqui, estou salvando o valor do datepicker no banco de dados sql2008. Meu tipo de campo é datetime em database.dpdob é o meu nome do 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 dob na sua consulta de inserção.

SwR
fonte
1

Você pode tentar este código

select (Convert(Date, '2018-04-01'))
Biddut
fonte
1

Eu tive esse problema ao tentar concatenar getdate() em uma string 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',
    '<h2>111 Any St.<br />Anywhere, ST 11111</h2><br />' + 
        CAST(CAST(getdate() AS datetime2) AS nvarchar) + 
    '<br /><br /><br />'
   )

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

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

Elencou a data como datetime2, então, nvarcharpara concatená-la.

vapcguy
fonte
1

Eu tentei isso e está trabalhando comigo:

SELECT CONVERT(date, yourDate ,104)
Abd Abughazaleh
fonte
0

defina Culture para inglês a partir do arquivo web.config

  <globalization uiCulture="en-US" culture="en-US" />

por exemplo, se você definir a cultura como á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 data e hora

Yusuf
fonte
0

Para mim, isso funcionou:

INSERT INTO [MyTable]
           ([ValidFrom]
           ,[ValidTo])
       VALUES
           ('2020-01-27 14:54:11.000'
           ,'2023-01-27 14:52:50.000')
Joel Wiklund
fonte