Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Conversion de date et culture :Différence entre DATE et DATETIME

L'ISO-8601 pour DATETIME (l'ancien type) est en quelque sorte "cassé" ou "adapté" (selon que vous le considérez comme un bogue ou une fonctionnalité) - vous devez utiliser YYYYMMDD (sans tous les tirets) pour le faire fonctionner indépendamment des paramètres de langue.

Pour DATE ou le DATETIME2(n) les types de données, cela a été corrigé et le "bon" format ISO-8601 YYYY-MM-DD sera toujours interprété correctement.

-- 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'); 

C'est une bizarrerie du DATETIME tapez (et pas le seul ....) - enregistrez-le simplement, sachez-le - et passez à autre chose (ce qui signifie :n'utilisez pas DATETIME plus - utilisez DATE ou DATETIME2(n) à la place - beaucoup plus agréable à travailler !) :-)