Comment convertir DateTime en VarChar

303

Je travaille sur une requête dans Sql Server 2005 où j'ai besoin de convertir une valeur en DateTimevariable en une varcharvariable en yyyy-mm-ddformat (sans partie de temps). Comment je fais ça?

Ali
la source
1
CONVERT, voir la documentation MSDN .
Jason Cohen
3
sachez que AAAA-MM-JJ est ambigu, selon vos paramètres de langue. mieux utiliser la norme ISO YYYYMMDD, voir cet article de blog
Andy Irving

Réponses:

262

Avec Microsoft Sql Server:

--
-- Create test case
--
DECLARE @myDateTime DATETIME
SET @myDateTime = '2008-05-03'

--
-- Convert string
--
SELECT LEFT(CONVERT(VARCHAR, @myDateTime, 120), 10)
TonyOssa
la source
12
Pour ceux d'entre vous qui pourraient être intéressés, cela fonctionnerait mieux si vous changez VARCHAR en CHAR. Voir cet article ( 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 aura toujours 10 caractères, donc CHAR est approprié.
Will Ediger
1
Remarque, d'après ce que j'ai vu, dommage qu'aucun des formats n'honore le DATEFORMAT, il y a peut-être une autre façon.
Alex Nolasco
3
Y a-t-il une raison d'utiliser à la LEFT(.., 10)place de CONVERT(CHAR(10), ...)? Ceux qui travaillent avec les versions de SQL Server plus récentes que 2005 (!) Devraient également vérifier la réponse de Zar Shardan suggérant une solution basée sur la FORMAT(date_value, format_string)fonction.
Nickolay
@Nickolay d'ailleurs FORMAT()est trop lent par rapport àconvert(char(10),...)
abdul qayyum
380

Voici quelques sql de test 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 to 19 not valid
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 to 99 not valid
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 to 125 not valid
union select convert(nvarchar(MAX), @now, 126), 126
union select convert(nvarchar(MAX), @now, 127), 127
--128, 129 not valid
union select convert(nvarchar(MAX), @now, 130), 130
union select convert(nvarchar(MAX), @now, 131), 131
--132 not valid
order BY style

Voici le résultat

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

Faire nvarchar(max)plus court pour couper le temps. Par exemple:

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

les sorties:

May 18 2018
May 18 2018  9:57AM
Colin
la source
Ici Parfois, nous voulons comme dd-mmou jun - 28. Il y a une option ??
Rock
Fonctionne pour SQL Server 2005, donc c'est génial pour ceux d'entre nous qui, malheureusement, se mêlent encore d'anciens systèmes. Mise à niveau vers 2014 bientôt, excité!
dyslexicanaboko
Je veux un format proche de 101 - 101 = 28/04/2014, je veux sans zéro dans le mois, sortie 28/04/2014, est-ce applicable?
ahmed abdelqader
1
L'identifiant de fuseau horaire Z n'est-il pas manquant dans le style 127.
Atishay
@Atishay "uniquement pris en charge lors de la conversion de données de caractères en datetime ou smalldatetime". Voir les notes de bas de page 6 et 7 sur docs.microsoft.com/de-de/sql/t-sql/functions/…
Colin
38

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 d'heure de date personnalisées: http://msdn.microsoft.com/en-us/library/ee634398.aspx

Ces pages impliquent qu'il est également disponible sur SQL2008R2, mais je n'en ai pas un à portée de main pour tester si c'est le cas.

Exemple d'utilisation (datetime australien):

FORMAT(VALUE,'dd/MM/yyyy h:mm:ss tt')
Zar Shardan
la source
9

Vous pouvez utiliser DATEPART(DATEPART, VARIABLE). Par exemple:

DECLARE @DAY INT 
DECLARE @MONTH INT
DECLARE @YEAR INT
DECLARE @DATE DATETIME
@DATE = GETDATE()
SELECT @DAY = DATEPART(DAY,@DATE)
SELECT @MONTH = DATEPART(MONTH,@DATE)
SELECT @YEAR = DATEPART(YEAR,@DATE)
FCKOE
la source
8

Soit Castou Convert:

Syntaxe pour CAST:

CAST ( expression AS data_type [ (length ) ])

Syntaxe pour CONVERT:

CONVERT ( data_type [ ( length ) ] , 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), '.', '-')
Per Hornshøj-Schierbeck
la source
6

- Cela vous donne l'heure en tant que 0 au format 'aaaa-mm-jj 00: 00: 00.000'


SELECT CAST( CONVERT(VARCHAR, GETDATE(), 101) AS DATETIME) ; 
P's-SQL
la source
5

Avec Microsoft SQL Server:

Utilisez la syntaxe pour CONVERT:

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

Exemple:

SELECT CONVERT(varchar,d.dateValue,1-9)

Pour le style, vous pouvez trouver plus d'informations ici: MSDN - Cast and Convert (Transact-SQL) .

dmunozpa
la source
3

Essayer:

select replace(convert(varchar, getdate(), 111),'/','-');

Plus sur les astuces MS SQL

Arek Bee
la source
3
declare @dt datetime

set @dt = getdate()

select convert(char(10),@dt,120) 

J'ai une longueur de données fixe de char(10)comme vous voulez un format de chaîne spécifique.

Andy Jones
la source
2

Le format OP mentionné datetime . Pour moi, la partie du temps gêne.
Je pense que c'est un peu plus propre de supprimer la partie temps (en castant datetime à ce jour) avant de formater.

convert( varchar(10), convert( date, @yourDate ) , 111 )
m42
la source
2

Voici comment je le fais: CONVERT(NVARCHAR(10), DATE1, 103) )

IvanSnek
la source
2

Vous pouvez convertir votre date dans de nombreux formats, la syntaxe est simple à utiliser:

CONVERT('TheTypeYouWant', 'TheDateToConvert', 'TheCodeForFormating' * )
CONVERT(NVARCHAR(10), DATE_OF_DAY, 103) => 15/09/2016
  • Le code est un entier, ici 3 est le troisième format sans siècle, si vous voulez que le siècle change simplement le code en 103.

Dans votre cas , je viens de convertir et de restreindre la taille de nvarchar (10) comme ceci:

CONVERT(NVARCHAR(10), MY_DATE_TIME, 120) => 2016-09-15

Voir plus à: http://www.w3schools.com/sql/func_convert.asp

Une autre solution (si votre date est un Datetime) est un simple CAST :

CAST(MY_DATE_TIME as DATE) => 2016-09-15
Ema.H
la source
2

Essayez ce SQL:

select REPLACE(CONVERT(VARCHAR(24),GETDATE(),103),'/','_') + '_'+ 
       REPLACE(CONVERT(VARCHAR(24),GETDATE(),114),':','_')
Dilkhush
la source
2

Pour SQL Server 2008+, vous pouvez utiliser CONVERT et FORMAT ensemble.

Par exemple, pour un horodatage de style européen (par exemple l'Allemagne):

CONVERT(VARCHAR, FORMAT(GETDATE(), 'dd.MM.yyyy HH:mm:ss', 'de-DE'))
Peter Majko
la source
1

Vous n'avez pas dit quelle base de données, mais avec mysql, voici un moyen facile d'obtenir une date à partir d'un horodatage (et la conversion du type varchar devrait se produire automatiquement):

mysql> select date(now());
+-------------+
| date(now()) |
+-------------+
| 2008-09-16  | 
+-------------+
1 row in set (0.00 sec)
Allan Wind
la source
1
Vérifiez à nouveau: il a spécifié le serveur sql via une balise.
Joel Coehoorn
1

Le moyen le plus court et le plus simple est:

DECLARE @now AS DATETIME = GETDATE()

SELECT CONVERT(VARCHAR, @now, 23)
Konstantin
la source
1
DECLARE @DateTime DATETIME
SET @DateTime = '2018-11-23 10:03:23'
SELECT CONVERT(VARCHAR(100),@DateTime,121 )
Dilkhush
la source
0
CONVERT(VARCHAR, GETDATE(), 23)
Gabriel
la source
0

Écrire une fonction

CREATE FUNCTION dbo.TO_SAP_DATETIME(@input datetime)
RETURNS VARCHAR(14)
AS BEGIN
    DECLARE @ret VARCHAR(14)
    SET @ret = COALESCE(SUBSTRING(REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR(26), @input, 25),'-',''),' ',''),':',''),1,14),'00000000000000');
    RETURN @ret
END
Beyhan
la source
0
select REPLACE(CONVERT(VARCHAR, FORMAT(GETDATE(), N'dd/MM/yyyy hh:mm:ss tt')),'.', '/')

donnera 05/05/2020 10:41:05 AMcomme résultat

Andres Galindo
la source
-3

Vous ne dites pas quelle langue mais je suppose C#/.NETcar il a un DateTimetype de données natif . Dans ce cas, convertissez-le simplement à l'aide de la ToStringméthode et utilisez un spécificateur de format tel que:

DateTime d = DateTime.Today;
string result = d.ToString("yyyy-MM-dd");

Cependant, je vous déconseille de l'utiliser dans une requête de base de données ou concaténé dans une instruction SQL. Les bases de données nécessitent l'utilisation d'une chaîne de formatage spécifique. Il est préférable de mettre à zéro la partie temps et d'utiliser le DateTime comme paramètre SQL si c'est ce que vous essayez d'accomplir.

Johnny Bravado
la source
Dans la question, il est mentionné "Je travaille sur une requête dans Sql Server 2005".
InkHeart
4
@InkHeart et tous les votants - Cette réponse a été publiée en 2008. Si vous consultez l'historique des modifications pour la question d'origine, il n'y avait pas de balises et / ou toute autre information liée à la technologie.
GSazheniuk