Pourquoi SQL Server CONVERT d'une valeur DATE à un style date + heure n'inclut pas une heure?

Si je fournis un style date + heure à la fonction CONVERT, je m'attends à get un résultat avec une partie date et heure.

Si l'expression à convertir est un type de données DATE, il n'y a pas de partie time dans le résultat. Je comprends qu'un type de données DATE n'a pas de composante de time mais je m'attends à voir une partie de time 00:00:00 dans le résultat parce que je spécifie explicitement un style date + heure.

Est-ce correct? Est-ce un comportement documenté?

declare @d date = '20160519' declare @dt datetime = '20160519' select '109 - Default + milliseconds' as Style, convert(varchar(32), @d, 109) as date_expression, convert(varchar(32), @dt, 109) as datetime_expression union all select '113 - Europe default + milliseconds', convert(varchar(32), @d, 113), convert(varchar(32), @dt, 113) union all select '120 - ODBC canonical', convert(varchar(32), @d, 120), convert(varchar(32), @dt, 120) union all select '121 - ODBC canonical (with milliseconds)', convert(varchar(32), @d, 121), convert(varchar(32), @dt, 121) union all select '126 - ISO8601', convert(varchar(32), @d, 126), convert(varchar(32), @dt, 126) union all select '127 - ISO8601 with time zone Z', convert(varchar(32), @d, 127), convert(varchar(32), @dt, 127) 

Et voici la sortie – notez aucun élément de time dans la deuxième colonne.

 Style | date_expression | datetime_expression ---------------------------------------------------------------------------------------- 109 - Default + milliseconds | May 19 2016 | May 19 2016 12:00:00:000AM 113 - Europe default + milliseconds | 19 May 2016 | 19 May 2016 00:00:00:000 120 - ODBC canonical | 2016-05-19 | 2016-05-19 00:00:00 121 - ODBC canonical (with milliseconds) | 2016-05-19 | 2016-05-19 00:00:00.000 126 - ISO8601 | 2016-05-19 | 2016-05-19T00:00:00 127 - ISO8601 with time zone Z | 2016-05-19 | 2016-05-19T00:00:00 

Je suis actuellement sur SQL Server 2012 – 11.0.5548.0 (X64)

Mise à jour : Je pense que la subtilité de la question est manquée par certaines personnes. Je ne request pas comment convertir une date en données de caractère avec ou sans une partie time 00:00:00, je request pourquoi la partie time est manquante lors de la conversion d'une date en données de caractères en utilisant un style date + heure. De BOL;

style Est une expression entière qui spécifie comment la fonction CONVERT doit traduire l'expression.

Lorsque j'utilise CONVERT pour traduire une valeur DATE en une valeur de caractère en utilisant un style de date + heure, j'attends que SQL Server inclue une partie de time 00:00:00 par défaut dans le format prescrit par le style.

Considérez le contraire; CONVERTIR une DATETIME avec un composant de time autre que minuit en données de caractères en utilisant un style de date seule n'inclut pas l'heure dans le résultat. Cela semble incohérent.

Je ne suis pas sûr de la sortie que vous attendez, mais votre supposition que vous spécifiez explicitement une sortie de style date et heure et que le server sql doit convertir la date en datetime, est fausse. Prenez convert(varchar(32), @d, 113) où @d est une DATE. Un type DATE ne stocke aucune information sur l'heure. Même 00: 00: 000 est une information, elle est utilisée par défaut lors de la conversion entre DATEs et DATETIME, mais elle ne fait pas partie d'une DATE.

Donc, vous convertissez une DATE en un varchar et vous spécifiez le siècle par exemple 113 (Europe par défaut, y compris les millisecondes). SQL Server prend fondamentalement votre requête et convertit la date à la sortie désirée, mais n'affiche aucune information de time car il n'y en a aucune dans votre variable DATE. Comme je l'ai dit, parce que vous spécifiez seulement quel format il devrait utiliser pour la conversion, pas n'importe quelle conversion dans un format datetime.

Si vous souhaitez inclure l'heure, vous devez d'abord convertir votre DATE en DATETIME:

 convert(varchar(32), CAST(@d AS DATETIME), 113)