El ISO-8601 para DATETIME
(el tipo más antiguo) está "roto" o "adaptado" de alguna manera (dependiendo de si lo considera un error o una función); debe usar YYYYMMDD
(sin guiones) para que funcione independientemente de la configuración de idioma.
Para DATE
o el DATETIME2(n)
tipos de datos, esto se ha corregido y el formato ISO-8601 "adecuado" YYYY-MM-DD
siempre se interpretará correctamente.
-- OK because of "adapted" ISO-8601
SET LANGUAGE GERMAN;
DECLARE @dt DATETIME='20170113';
SELECT @dt;
SELECT CAST('20170113' AS DATETIME);
SELECT CONVERT(DATETIME, '20170113');
-- OK because of DATETIME2(n)
SET LANGUAGE GERMAN;
DECLARE @dt2 DATETIME2(0) = '2017-01-13';
SELECT @dt2;
SELECT CAST('2017-01-13' AS DATETIME2(0));
SELECT CONVERT(DATETIME2(0), '2017-01-13');
Es una peculiaridad del DATETIME
tipo (y no el único....) - simplemente regístrelo, sepa sobre él - y siga adelante (es decir:no use DATETIME
más - usa DATE
o DATETIME2(n)
en cambio, ¡es mucho más agradable trabajar con él!) :-)