Comment obtenir une date au format AAAA-MM-JJ à partir d'un champ datetime TSQL?

260

Comment récupérer une date de SQL Server au YYYY-MM-DDformat? J'ai besoin de cela pour travailler avec SQL Server 2000 et plus. Existe-t-il un moyen simple d'effectuer cela dans SQL Server ou serait-il plus facile de le convertir par programme après avoir récupéré le jeu de résultats?

J'ai lu CAST et CONVERT sur Microsoft Technet, mais le format que je veux n'est pas répertorié et changer le format de date n'est pas une option.

Kinze
la source
La description BOL pour 126 est un peu confuse (jamais trouvé d'explication pour "T").
nojetlag
Le "T" sépare la date de l'heure. Voir ISO 8601 sur Wikipédia
krubo

Réponses:

429
SELECT CONVERT(char(10), GetDate(),126)

Limiter la taille des côtelettes varchar de la portion d'heure que vous ne voulez pas.

Darrel Miller
la source
3
Non, mais certains clients ont des problèmes avec la longueur fixe.
gbn
55
Ce message apparaît dans Google pour la conversion en YYYYMMDD - de sorte que l'un soit: CONVERT (char (10), GetDate (), 112)
NealWalters
1
Cela n'a pas fonctionné pour moi, la suggestion ci-dessus avec un code 112 l'a fait. Merci @NealWalters
AlexVPerl
4
La liste des codes entiers pour les styles de sortie: msdn.microsoft.com/en-us/library/ms187928.aspx
Ben Fransen
Le code 126 convient aux dates telles qu'une date de naissance au format AAAA-mm-jj: CONVERTIR (char (10), pat_dob, 126) en pat_dob
jjwdesign
118
SELECT convert(varchar, getdate(), 100) -- mon dd yyyy hh:mmAM

SELECT convert(varchar, getdate(), 101) -- mm/dd/yyyy – 10/02/2008                  

SELECT convert(varchar, getdate(), 102) -- yyyy.mm.dd – 2008.10.02           

SELECT convert(varchar, getdate(), 103) -- dd/mm/yyyy

SELECT convert(varchar, getdate(), 104) -- dd.mm.yyyy

SELECT convert(varchar, getdate(), 105) -- dd-mm-yyyy

SELECT convert(varchar, getdate(), 106) -- dd mon yyyy

SELECT convert(varchar, getdate(), 107) -- mon dd, yyyy

SELECT convert(varchar, getdate(), 108) -- hh:mm:ss

SELECT convert(varchar, getdate(), 109) -- mon dd yyyy hh:mm:ss:mmmAM (or PM)

SELECT convert(varchar, getdate(), 110) -- mm-dd-yyyy

SELECT convert(varchar, getdate(), 111) -- yyyy/mm/dd

SELECT convert(varchar, getdate(), 112) -- yyyymmdd

SELECT convert(varchar, getdate(), 113) -- dd mon yyyy hh:mm:ss:mmm

SELECT convert(varchar, getdate(), 114) -- hh:mm:ss:mmm(24h)

SELECT convert(varchar, getdate(), 120) -- yyyy-mm-dd hh:mm:ss(24h)

SELECT convert(varchar, getdate(), 121) -- yyyy-mm-dd hh:mm:ss.mmm

SELECT convert(varchar, getdate(), 126) -- yyyy-mm-ddThh:mm:ss.mmm
Imran
la source
1
comment obtenir 'm / d / yyyy' au lieu de 'mm / dd / yyyy'
user_az
C'est de loin la réponse la plus utile.
Daniel
109

À partir de SQL Server 2012 (la question d'origine concerne 2000):

SELECT FORMAT(GetDate(), 'yyyy-MM-dd')

Ignas Vyšnia
la source
C'est la manière flexible et sensée de faire la date / l'heure dans les versions SQL récentes en utilisant les formats standard Dotnet. N'oubliez pas de mettre en majuscule le mois MM pour distinguer les minutes. Tous les formats de date et d'heure
Jim Birch
FORMAT s'exécute (généralement) 43 fois plus lentement que CONVERT. Je recommande fortement de ne jamais utiliser (et je n'utilise pas souvent ce mot) FORMAT.
Jeff Moden Il y a
35

Le formulaire que vous recherchez est répertorié dans la documentation en ligne du livre.

http://msdn.microsoft.com/en-us/library/aa226054(SQL.80).aspx

Par exemple, essayez ce qui suit:

select convert(varchar,getDate(),120)
select convert(varchar(10),getDate(),120)
John Sansom
la source
4
Si vous prenez la valeur par défaut, dans ce cas, vous obtenez la valeur de temps - le format entier pour le format 120 est 'aaaa-mm-jj hh: mi: ss'. En déclarant explicitement la longueur, elle est rognée au format que vous avez spécifié dans votre note d'origine - «aaaa-mm-jj».
DaveE
26

La convertfonction avec le spécificateur de format 120 vous donnera le format "aaaa-MM-jj HH: mm: ss", il vous suffit donc de limiter la longueur à 10 pour obtenir uniquement la partie date:

convert(varchar(10), theDate, 120)

Cependant, le formatage des dates est généralement préférable dans la couche de présentation plutôt que dans la base de données ou la couche métier. Si vous renvoyez la date formatée à partir de la base de données, le code client doit à nouveau l'analyser à une date s'il doit effectuer des calculs à ce sujet.

Exemple en C #:

theDate.ToString("yyyy-MM-dd")
Guffa
la source
1
Pourquoi le downvote? Si vous n'expliquez pas ce que vous pensez être faux, cela ne peut pas améliorer la réponse.
Guffa
14

Pour YYYYMMDD, essayez

select convert(varchar,getDate(),112)

Je n'ai testé que sur SQLServer2008.

LosManos
la source
7

Une autre façon ...

CONVERT(varchar, DATEPART(yyyy, @datetime)) + '/' + CONVERT(varchar, DATEPART(mm, @datetime)) + '/' + CONVERT(varchar, DATEPART(dd, @datetime)) 
Athadu
la source
1
Cela créera des dates à 1 chiffre comme le 03/08/2012 si vous voulez 2 mm mm / jj, vous devez remplir à gauche les dates. DROIT ('00 '+ CONVERT (varchar, DATEPART (yyyy, @datetime)), 2) par exemple
MindStalker
7

Pour ceux qui voudraient également une partie du temps (je l'ai fait), l'extrait de code suivant peut aider

SELECT convert(varchar, getdate(), 120) -- yyyy-mm-dd hh:mm:ss(24h)
SELECT convert(varchar, getdate(), 121) -- yyyy-mm-dd hh:mm:ss.mmm
SELECT convert(varchar, getdate(), 126) -- yyyy-mm-ddThh:mm:ss.mmm
                              --example -- 2008-10-02T10:52:47.513
user2431693
la source
6
replace(convert(varchar, getdate(), 111), '/','-')

Fera également l'affaire sans "couper quoi que ce soit".

Rafael Emshoff
la source
Je préfère cette version pour éviter les bugs "année 9999" associés à la version convert (varchar (10) ...).
Francis Huang
6

Au cas où quelqu'un voudrait le faire dans l' autre sens et le trouverait.

select convert(datetime, '12.09.2014', 104)

Cela convertit une chaîne au format de date allemand en un objet datetime.

Pourquoi 104? Voir ici: http://msdn.microsoft.com/en-us/library/ms187928.aspx

Jenny O'Reilly
la source
5

Dans votre lien de conversion et de conversion, utilisez le style 126 ainsi:

CONVERT (varchar(10), DTvalue, 126)

Cela tronque le temps. Votre exigence de l'avoir en aaaa-mm-jj signifie qu'il doit s'agir d'un type de données de chaîne et de datetime.

Franchement, je le ferais sur le client, sauf si vous avez de bonnes raisons de ne pas le faire.

gbn
la source
4

Si vous souhaitez l'utiliser comme date au lieu d'une date varcharaprès, n'oubliez pas de la reconvertir:

select convert(datetime,CONVERT(char(10), GetDate(),126))
Wayne Evans
la source
cela ne le reconvertirait-il pas au format par défaut du système?
Ignas Vyšnia
3

Je ne sais pas pourquoi le moyen le plus simple a été ignoré / omis dans les réponses ci-dessus:

SELECT FORMAT(GetDate(),'yyyy-MM-dd');--= 2020-01-02

SELECT FORMAT(GetDate(),'dd MMM yyyy HH:mm:ss');-- = 02 Jan 2020 08:08:08

Je préfère la seconde car quelle que soit la langue que vous parlez, vous comprendrez quelle date c'est!

De plus, SQL Server le comprend toujours lorsque vous l'envoyez à votre procédure de sauvegarde, quels que soient les formats régionaux définis sur les ordinateurs - j'utilise toujours l'année complète (aaaa), le nom du mois (MMM) et le format 24 heures (HH majuscule) pendant une heure dans ma programmation.

Hannington Mambo
la source
2

SELECT CONVERT(NVARCHAR(20), GETDATE(), 23)

Dmitri Kouminov
la source
1
pourquoi utiliser NVARCHAR (20)? pourrait-il y avoir des caractères spéciaux là-dedans?
KM.
Je préfère utiliser UNICODE. Mos de mes projets internationaux ;-)
Dmitri Kouminov
2

Vous pouvez également utiliser. C'est en utilisant le nouveau type de données DATE. Peut ne pas fonctionner dans toutes les versions précédentes, mais considérablement simplifié pour une utilisation dans une version ultérieure.

SELECT CAST(getdate() AS DATE)
SELECT LEFT(CAST(getdate() AS DATE), 7)
Sams
la source
1

J'utiliserais:

CONVERT(char(10),GETDATE(),126)
KM.
la source
1
SELECT Code,Description FROM TABLE

-- This will Include only date part of 14th March 2010. Any date with date companents will not be considered.
WHERE ID= 1 AND FromDate >= CONVERT(DATETIME, '2010-02-14', 126) AND ToDate <= DATEADD(dd, 1, CONVERT(DATETIME, '2010-03-14', 126))

-- This will Include the whole day of 14th March 2010
--WHERE ID= 1 AND FromDate >= CONVERT(DATETIME, '2010-02-14', 126) AND ToDate < DATEADD(dd, 1, CONVERT(DATETIME, '2010-03-14', 126))
arun.passioniway
la source
1

À partir de SQL Server 2008, vous pouvez le faire: CONVERT(date,getdate())

Asher
la source
1

Semble inutile de faire des choses étranges, si vous voulez que votre date soit séparée par une barre oblique. Échapper juste avec une barre oblique inverse. Sinon, vous vous retrouverez avec un point.

SELECT FORMAT(GETDATE(),'yyyy\/MM');  

Testé sur SQL Server 2016

cuilster
la source
Vous devez le tester pour les performances. FORMAT est généralement 43 fois plus lent que même un CONVERT compliqué.
Jeff Moden Il y a
0

L'utilisation d'une instruction CASE pour chacune des fonctions de conversion / conversion fonctionne toujours pour moi:

Veuillez remplacer tableXXXXY par le nom de votre table et issueDate_dat par le nom de votre champ datetime dans cette table:

SELECT  issueDate_dat, CONVERT(varchar, DATEPART(yyyy, issuedate_dat))  AS issueDateYYYY
, CASE WHEN (len(CONVERT(varchar, DATEPART(mm, issuedate_dat))) < 2) THEN '0' +CONVERT(varchar, DATEPART(mm, issuedate_dat)) ELSE CONVERT(varchar, DATEPART(mm, issuedate_dat)) END AS  issueDateMM
, CASE WHEN (len(CONVERT(varchar, DATEPART(dd, issuedate_dat))) <2) THEN '0' +CONVERT(varchar, DATEPART(dd, issuedate_dat)) ELSE CONVERT(varchar, DATEPART(dd, issuedate_dat)) END AS issueDateDD
FROM            tableXXXXY

J'espère que cela vous a été utile. chagbert.

Chagbert
la source
0

Cette solution fonctionne pour moi, simple et efficace (avec 126 aussi)

CONVERT(NVARCHAR(MAX), CAST(GETDATE() as date), 120)
anfehernandez94
la source
0

Si votre format de date source est tout foiré, essayez quelque chose comme:

select
convert(nvarchar(50),year(a.messedupDate))+'-'+
(case when len(convert(nvarchar(50),month(a.messedupDate)))=1 
    then '0'+ convert(nvarchar(50),month(a.messedupDate))+'-' 
    else convert(nvarchar(50),month(a.messedupDate)) end)+
(case when len(convert(nvarchar(50),day(a.messedupDate)))=1 
    then '0'+ convert(nvarchar(50),day(a.messedupDate))+'-'
    else convert(nvarchar(50),day(a.messedupDate)) end) 
from messytable a
CArnold
la source
0
 IFormatProvider culture = new System.Globalization.CultureInfo("fr-FR", true);

cmdGetPaymentStatement.Parameters.AddWithValue("@pStartDate", DateTime.Parse("22/12/2017", culture, System.Globalization.DateTimeStyles.AssumeLocal)).IsNullable = true;
Raj Kumar
la source
Le code ci-dessus est utilisé pour fournir une procédure de stockage à paramétrer sous la forme de mm / jj / aaaa
Raj Kumar