sql >> Base de Datos >  >> RDS >> Sqlserver

Conversión de fecha y cultura:diferencia entre DATE y DATETIME

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!) :-)