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.