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
{ts'2016-09-15 17:30:00'}
– carimbo de hora {d'2016-09-15'}
– Apenas datas {t'17:30:00'}
– Somente horário '2016-09-15T17:30:00'
esteja ciente do T
no meio! '20160915'
somente para data pura 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