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

Conversão de data e cultura:diferença entre DATE e DATETIME


O ISO-8601 para DATETIME (o tipo mais antigo) está de alguma forma "quebrado" ou "adaptado" (dependendo se você o vê como um bug ou um recurso) - você precisa usar YYYYMMDD (sem quaisquer traços) para fazê-lo funcionar independentemente das configurações de idioma.

Para DATE ou o DATETIME2(n) tipos de dados, isso foi corrigido e o formato ISO-8601 "adequado" YYYY-MM-DD sempre será interpretado corretamente.
-- 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'); 

É uma peculiaridade do DATETIME digite (e não o único....) - apenas registre, saiba disso - e siga em frente (significado:não use DATETIME mais - use DATE ou DATETIME2(n) em vez disso - muito mais agradável de trabalhar!) :-)