Se você precisar especificar datas usando strings, você deve usar um seguro , formato independente de idioma.
No SQL Server, esse é o formato ISO-8601 (ligeiramente adaptado) e suporta basicamente dois formatos seguros para
DATETIME
que sempre funcionam - independentemente do seu idioma, configurações regionais e formato de data:YYYYMMDD (e.g. 20121231 for 31st of December 2012) if you need date only
YYYY-MM-DDTHH:mm:ss (e.g. 2012-12-31T21:05:00 for 31st of December 2012, 9:05pm)
Observação:
-
o primeiro formato somente de data tem sem traços ou delimitadores!
-
o segundo formato tem traços para a data (pode ser omitido também), e há umT
fixo como delimitador entre a parte de data e hora da string
Atualização: de acordo com seu último comentário (nos diferentes idiomas padrão para os dois usuários) - tente isto:
-- this is how your `SA` interprets the string as datetime....
SET LANGUAGE english
SELECT CAST('2012-11-30 23:59' AS DATETIME)
Funciona direitinho...
-- this is how your British user interprets teh string as datetime
SET LANGUAGE british
SELECT CAST('2012-11-30 23:59' AS DATETIME)
Isso tenta interpretar a string como 11º do 30º mês de 2012 e obviamente, isso falha ....