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?
sql
sql-server
Mari
fonte
fonte
Respostas:
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:
YYYYMMDD
por 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:SS
para datas e horas - observe aqui: esse formato possui hífens (mas eles podem ser omitidos) e umT
delimitador fixo entre a parte de data e hora do seuDATETIME
.Isso é válido para o SQL Server 2000 e mais recente.
Portanto, no seu caso concreto - use estas strings:
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
DATETIME2
tipo de dados (em vez de simplesDATETIME
) e sua correnteINSERT
funcionaria 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.Não me pergunte por que todo esse tópico é tão complicado e um tanto confuso - é assim que é. Mas com o
YYYYMMDD
formato, 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.fonte
À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).
fonte
Resposta simples - 5 é italiano "aa" e 105 é italiano "aaaa". Portanto:
funcionará corretamente, mas
dará erro.
Da mesma forma,
dará erro, onde
vai funcionar.
fonte
Basta atualizar o formato da data como abaixo
Resolve o problema para mim e funciona bem
fonte
DATEFORMAT
configuração de sessão . Verifique isso executandoSET 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 umT
separador (yyyy-MM-ddTHH:mm:ss
).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 apenasISO8601 (o melhor para qualquer lugar )
'2016-09-15T17:30:00'
- esteja ciente doT
meio!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
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 .
fonte
a melhor maneira é esse código
fonte
fonte
O formato de data e hora realmente executado no servidor sql é
fonte
m
eM
). Leia o comentário de Dan Guzman na resposta de Pronab Roy. E leia as outras respostas aqui ...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.
Agora use dob na sua consulta de inserção.
fonte
Você pode tentar este código
fonte
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:
Esse é um exemplo higienizado. A parte principal disso é:
...' + CAST(CAST(getdate() AS datetime2) AS nvarchar) + '...
Elencou a data como
datetime2
, então,nvarchar
para concatená-la.fonte
Eu tentei isso e está trabalhando comigo:
fonte
defina Culture para inglês a partir do arquivo web.config
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
fonte
Veja como converter facilmente de uma string ISO para um SQL-Server
datetime
:Fonte https://www.sqlservercurry.com/2010/04/convert-character-string-iso-date-to.html
fonte
Para mim, isso funcionou:
fonte