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.


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.


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

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


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)

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")

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.


7

Une autre façon ...

CONVERT(varchar, DATEPART(yyyy, @datetime)) + '/' + CONVERT(varchar, DATEPART(mm, @datetime)) + '/' + CONVERT(varchar, DATEPART(dd, @datetime)) 

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

6
replace(convert(varchar, getdate(), 111), '/','-')

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


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


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.


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

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.


2

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


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)

1

J'utiliserais:

CONVERT(char(10),GETDATE(),126)

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

1

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


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


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.


0

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

CONVERT(NVARCHAR(MAX), CAST(GETDATE() as date), 120)

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

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;

Le code ci-dessus est utilisé pour fournir une procédure de stockage à paramétrer sous la forme de mm / jj / aaaa
Raj Kumar
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.