Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

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


Há muitos formatos suportados pelo SQL Server - consulte os Manuais Online do MSDN sobre CAST e CONVERT. A maioria desses formatos é dependente em quais configurações você tem - portanto, essas configurações podem funcionar algumas vezes - e às vezes não.

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

O formato ISO-8601 é suportado pelo SQL Server em dois tipos:
  • YYYYMMDD apenas para datas (sem porção de tempo); observe aqui:sem traços! , isso é muito importante! YYYY-MM-DD é NÃO independente das configurações de formato de data em seu SQL Server e NÃO trabalhe em todas as situações!

ou:
  • YYYY-MM-DDTHH:MM:SS para datas e horas - observe aqui:este formato tem traços (mas eles podem ser omitido), e um T fixo como delimitador entre a parte de data e hora do seu DATETIME .

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

Então, no seu caso específico - use estas strings:
insert into table1 values('2012-02-21T18:10:00', '2012-01-01T00:00:00');

e você deve ficar bem (observação:você precisa usar o código internacional 24 horas formato em vez do formato AM/PM de 12 horas para isso).

Alternativamente :se você estiver no SQL Server 2008 ou mais recente, você também pode usar o DATETIME2 tipo de dados (em vez de simples DATETIME ) e seu INSERT atual funcionaria sem problemas! :-) 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 esse tópico é tão complicado e um tanto confuso - é assim que é. Mas com o YYYYMMDD formato, você deve estar bem para qualquer versão do SQL Server e para qualquer configuração de idioma e formato de data em seu SQL Server.