328 votes

Comment convertir DateTime en VarChar

Je dois convertir une valeur qui se trouve dans une variable DateTime en une variable varchar formatée en yyyy-mm-dd (sans partie temps).

Comment dois-je faire?

1 votes

CONVERT, consultez la documentation MSDN.

3 votes

Soyez conscient que YYYY-MM-DD est ambigu, selon les paramètres de votre langue. il est préférable d'utiliser la norme ISO YYYYMMDD, voir cet article de blog

415voto

Colin Points 5006

Voici des tests SQL pour tous les styles.

DECLARE @now datetime
SET @now = GETDATE()
select convert(nvarchar(MAX), @now, 0) as output, 0 as style 
union select convert(nvarchar(MAX), @now, 1), 1
union select convert(nvarchar(MAX), @now, 2), 2
union select convert(nvarchar(MAX), @now, 3), 3
union select convert(nvarchar(MAX), @now, 4), 4
union select convert(nvarchar(MAX), @now, 5), 5
union select convert(nvarchar(MAX), @now, 6), 6
union select convert(nvarchar(MAX), @now, 7), 7
union select convert(nvarchar(MAX), @now, 8), 8
union select convert(nvarchar(MAX), @now, 9), 9
union select convert(nvarchar(MAX), @now, 10), 10
union select convert(nvarchar(MAX), @now, 11), 11
union select convert(nvarchar(MAX), @now, 12), 12
union select convert(nvarchar(MAX), @now, 13), 13
union select convert(nvarchar(MAX), @now, 14), 14
--15 à 19 non valables
union select convert(nvarchar(MAX), @now, 20), 20
union select convert(nvarchar(MAX), @now, 21), 21
union select convert(nvarchar(MAX), @now, 22), 22
union select convert(nvarchar(MAX), @now, 23), 23
union select convert(nvarchar(MAX), @now, 24), 24
union select convert(nvarchar(MAX), @now, 25), 25
--26 à 99 non valides
union select convert(nvarchar(MAX), @now, 100), 100
union select convert(nvarchar(MAX), @now, 101), 101
union select convert(nvarchar(MAX), @now, 102), 102
union select convert(nvarchar(MAX), @now, 103), 103
union select convert(nvarchar(MAX), @now, 104), 104
union select convert(nvarchar(MAX), @now, 105), 105
union select convert(nvarchar(MAX), @now, 106), 106
union select convert(nvarchar(MAX), @now, 107), 107
union select convert(nvarchar(MAX), @now, 108), 108
union select convert(nvarchar(MAX), @now, 109), 109
union select convert(nvarchar(MAX), @now, 110), 110
union select convert(nvarchar(MAX), @now, 111), 111
union select convert(nvarchar(MAX), @now, 112), 112
union select convert(nvarchar(MAX), @now, 113), 113
union select convert(nvarchar(MAX), @now, 114), 114
union select convert(nvarchar(MAX), @now, 120), 120
union select convert(nvarchar(MAX), @now, 121), 121
--122 à 125 non valables
union select convert(nvarchar(MAX), @now, 126), 126
union select convert(nvarchar(MAX), @now, 127), 127
--128, 129 non valables
union select convert(nvarchar(MAX), @now, 130), 130
union select convert(nvarchar(MAX), @now, 131), 131
--132 non valables
order BY style

Voici le résultat

output                   style
28 avr. 2014  9:31          0
28/04/14                     1
14.04.28                     2
28/04/14                     3
28.04.14                     4
28-04-14                     5
28 avr. 14                  6
28 avr. 14                  7
09:31:28                     8
28 avr. 2014  9:31:28     9
04-28-14                     10
14/04/28                     11
140428                       12
28 avr. 2014 09:31     13
09:31:28                     14
2014-04-28 09:31          20
2014-04-28 09:31:28      21
28/04/14  9:31          22
2014-04-28                   23
09:31:28                     24
2014-04-28 09:31:28      25
28 avr. 2014  9:31          100
28/04/2014                   101
2014.04.28                   102
28/04/2014                   103
28.04.2014                   104
28-04-2014                   105
28 avr. 2014                  106
28 avr. 2014                 107
09:31:28                     108
28 avr. 2014  9:31:28     109
04-28-2014                   110
2014/04/28                   111
20140428                     112
28 avr. 2014 09:31     113
09:31:28                     114
2014-04-28 09:31          120
2014-04-28 09:31:28      121
2014-04-28T09:31:28      126
2014-04-28T09:31:28      127
28 جمادى الثانية 1435  9:31    130
28/06/1435  9:31    131

Réduisez nvarchar(max) pour raccourcir le temps. Par exemple :

select convert(nvarchar(11), GETDATE(), 0)
union select convert(nvarchar(max), GETDATE(), 0)

affiche:

18 mai 2018
18 mai 2018  9:57

0 votes

Voici Parfois nous voulons comme dd-mm ou jun - 28. Y a-t-il une option??

0 votes

Fonctionne pour SQL Server 2005 donc c'est génial pour ceux d'entre nous qui sont malheureusement encore à jongler avec des systèmes plus anciens. Passage à 2014 bientôt, excité !

0 votes

Je veux formater proche de 101 - 101 = 28/04/2014, je veux sans zéro dans le mois, sortie 4/28/2014, est-ce applicable ?

272voto

TonyOssa Points 1303

Avec Microsoft Sql Server:

--
-- Créer un cas de test
--
DECLARE @myDateTime DATETIME
SET @myDateTime = '2008-05-03'

--
-- Convertir une chaîne de caractères
--
SELECT LEFT(CONVERT(VARCHAR, @myDateTime, 120), 10)

12 votes

Pour ceux d'entre vous qui pourraient être intéressés, ceci fonctionnerait mieux si vous changez VARCHAR en CHAR. Voir ce post (stackoverflow.com/questions/59667/…) pour plus de détails. Essentiellement, il y a 2 octets de surcharge impliqués dans VARCHAR vs CHAR. Dans ce scénario, nous savons que votre chaîne sera toujours de 10 caractères, donc CHAR est approprié.

1 votes

Notez bien, d'après ce que j'ai vu, c'est dommage que aucun des formats ne respecte ce qui est défini dans DATEFORMAT, peut-être y a-t-il une autre solution.

3 votes

Y a-t-il une raison d'utiliser LEFT(.., 10) au lieu de CONVERT(CHAR(10), ...)? Ceux qui travaillent avec les versions plus récentes de SQL Server que 2005 (!) devraient consulter la réponse de Zar Shardan suggérant une solution basée sur la fonction FORMAT(date_value, format_string).

188voto

Joel Coehoorn Points 190579

Essayez ce qui suit :

CONVERT(varchar(10), [MaColonneDateTime], 20)

Pour un datetime complet et non seulement une date :

CONVERT(varchar(23), [MaColonneDateTime], 121)

Consultez cette page pour les styles de conversion :

http://msdn.microsoft.com/en-us/library/ms187928.aspx
OU
Fonction CONVERT() SQL Server

40voto

Zar Shardan Points 1305

SQL Server 2012 a une nouvelle fonction, FORMAT : http://msdn.microsoft.com/en-us/library/ee634924.aspx

et vous pouvez utiliser des chaînes de format de date et d'heure personnalisées : http://msdn.microsoft.com/en-us/library/ee634398.aspx

Ces pages laissent entendre qu'elle est également disponible sur SQL2008R2, mais je n'en ai pas sous la main pour vérifier si c'est le cas.

Exemple d'utilisation (heure et date australiennes) :

FORMAT(VALUE,'dd/MM/yyyy h:mm:ss tt')

8voto

Soit Cast soit Convert:

Syntaxe pour CAST:

CAST (expression AS data_type [(longueur)])

Syntaxe pour CONVERT:

CONVERT (data_type [(longueur)], expression [, style])

http://msdn.microsoft.com/en-us/library/ms187928.aspx

En fait, puisque vous avez demandé un format spécifique:

REPLACE(CONVERT(varchar(10), Date, 102), '.', '-')

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X