Eu estava a tentar criar uma tabela como se 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 um ditado de erro,
*Não é possível converter varchar para a data
Então eu tentei o formato abaixo como um dos posts sugeridos 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 a receber o ditado de erro,
Conversão falhou ao converter data e/ou hora da cadeia de caracteres.
Alguma sugestão?
Existem muitos formatos suportados pelo SQL Server - veja o MSDN Books Online on CAST and CONVERT. A maioria desses formatos são dependentes de quais configurações você tem - portanto, essas configurações podem funcionar algumas vezes - e às vezes não.
A forma de resolver isto é usar o formato de data (ligeiramente adaptado) ISO-8601 que é suportado pelo SQL Server - este formato funciona sempre*** - independentemente da linguagem do seu SQL Server e das definições do formato de data.
O formato ISO-8601 é suportado pelo SQL Server vem em dois sabores:
ou..:
YYYYY-MM-DDTHH:MM:SS
para datas e horas - note aqui: este formato tem traços (mas eles podem ser omitidos), e um T
fixo como delimitador entre a porção de data e hora do seu DATETIME
.Isto é válido para o SQL Server 2000 e mais recentes.
Portanto, no seu caso concreto - use estas cordas:
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 **24 horas*** em vez do formato de 12 horas AM/PM para isso).
Alternativamente: se você're no SQL Server 2008 ou mais recente, você também poderia utilizar o DATETIME2
datatype (em vez do simples DATETIME
) e seu atual INSERT
funcionaria sem nenhum problema! :-) O DATETIME2
é muito melhor e muito menos exigente nas conversões - e é's o tipo de dados recomendado de data/hora para o SQL Server 2008 ou mais recente de qualquer forma.
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
Don'não me pergunte porque todo este tópico é tão complicado e um pouco confuso - isso'é exatamente como é. Mas com o formato YYYYMMDD
, você deve estar bem para qualquer versão do SQL Server e para qualquer linguagem e formato de data no seu SQL Server.
A conversão no servidor SQL falha às vezes não por causa dos formatos de Data ou Hora utilizados, É apenas porque você está tentando armazenar dados errados que não são aceitáveis para o sistema.
Exemplo:
Criar tabela MyTable (MyDate); Criar tabela MyTable (MyDate);
Inserir em valores MyTable(MyDate) ('2015-02-29');`
O servidor SQL irá lançar o seguinte erro:
A conversão falhou ao converter data e/ou hora da cadeia de caracteres.
A razão deste erro é simplesmente não existir tal data (Fev-29) no Ano (2015).
Resposta simples - 5 é italiano "yyy" e 105 é italiano "yyyy". Portanto:
SELECT convert(datetime,'21-02-12 6:10:00 PM',5)
vai funcionar correctamente, mas
SELECT convert(datetime,'21-02-12 6:10:00 PM',105)
vai dar erro.
Igualmente,
SELECT convert(datetime,'21-02-2012 6:10:00 PM',5)
dará erro, onde como
SELECT convert(datetime,'21-02-2012 6:10:00 PM',105)
vai funcionar.