Come ottenere una data nel formato AAAA-MM-GG da un campo datetime TSQL?


260

Come recuperare una data da SQL Server in YYYY-MM-DDformato? Ho bisogno che funzioni con SQL Server 2000 e versioni successive. Esiste un modo semplice per eseguire questa operazione in SQL Server o sarebbe più semplice convertirlo a livello di codice dopo aver recuperato il set di risultati?

Ho letto CAST e CONVERT su Microsoft Technet, ma il formato che desidero non è elencato e la modifica del formato della data non è un'opzione.


La descrizione BOL per 126 è un po 'confusa (non ho mai trovato una spiegazione per "T").
nojetlag,

La "T" separa la data dall'ora. Vedi ISO 8601 su Wikipedia
krubo,

Risposte:


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

Limitare la dimensione delle braciole varchar della porzione oraria che non si desidera.


3
No, ma alcuni client hanno problemi con la lunghezza fissa.
gbn

55
Questo post viene pubblicato su Google per la conversione in AAAAMMGG - quindi uno è: CONVERT (char (10), GetDate (), 112)
NealWalters

1
Questo non ha funzionato per me, suggerimento sopra con un codice 112 ha fatto. Grazie @NealWalters
AlexVPerl,

4
L'elenco dei codici interi per gli stili di output: msdn.microsoft.com/en-us/library/ms187928.aspx
Ben Fransen,

Il codice 126 è valido per date come una data di nascita nel formato AAAA-mm-gg: CONVERT (char (10), pat_dob, 126) come 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
come ottenere 'm / g / aaaa' invece 'mm / gg / aaaa'
user_az

Questa è di gran lunga la risposta più utile.
Daniel,

109

A partire da SQL Server 2012 (la domanda originale è per il 2000):

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


Questo è il modo sano e flessibile di eseguire data / ora nelle recenti versioni SQL utilizzando i formati standard Dotnet. Ricorda di capitalizzare il mese MM per distinguerlo dai minuti. Tutti i formati di data e ora
jim birch,

FORMAT viene eseguito (in genere) 43 volte più lentamente di CONVERT. Consiglio vivamente di non usare mai (e non uso spesso quella parola) FORMATO.
Jeff Moden

35

Il modulo che stai cercando è elencato nella documentazione online dei libri.

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

Ad esempio, prova quanto segue:

select convert(varchar,getDate(),120)
select convert(varchar(10),getDate(),120)

4
Se si prende il valore predefinito, in questo caso si ottiene il valore dell'ora: l'intero formato per il formato 120 è "aaaa-mm-gg hh: mi: ss". Dichiarando esplicitamente la lunghezza, viene ritagliata nel formato specificato nella nota originale - "aaaa-mm-gg".
DaveE,

26

La convertfunzione con l'identificatore di formato 120 ti darà il formato "aaaa-MM-gg HH: mm: ss", quindi devi solo limitare la lunghezza a 10 per ottenere solo la parte della data:

convert(varchar(10), theDate, 120)

Tuttavia, le date di formattazione sono generalmente migliori nel livello di presentazione piuttosto che nel database o nel livello aziendale. Se si restituisce la data formattata dal database, il codice client deve analizzarla di nuovo a una data se è necessario eseguire calcoli su di essa.

Esempio in C #:

theDate.ToString("yyyy-MM-dd")

1
Perché il downvote? Se non spieghi cosa pensi sia sbagliato, non puoi migliorare la risposta.
Guffa,

14

Per AAAAMMGG provare

select convert(varchar,getDate(),112)

Ho provato solo su SQLServer2008.


7

Un altro modo ...

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

1
Questo creerà date a 1 cifra come nel 03/08/2012 se vuoi 2 cifre mm / gg devi spostare a sinistra le date. DESTRA ('00 '+ CONVERT (varchar, DATEPART (yyyy, @datetime)), 2) ad esempio
MindStalker

7

Per coloro che desiderano anche la parte temporale (l'ho fatto), il seguente frammento può essere di aiuto

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

Farà anche il trucco senza "tagliare qualcosa".


Preferisco questa versione per evitare bug "anno 9999" associati alla versione convert (varchar (10) ...).
Francis Huang,


5

Nel tuo cast e converti link, usa lo stile 126 così:

CONVERT (varchar(10), DTvalue, 126)

Questo tronca il tempo. Il tuo requisito per averlo in aaaa-mm-gg significa che deve essere un tipo di dati stringa e datetime.

Francamente, lo farei sul cliente a meno che tu non abbia buone ragioni per non farlo.


4

Se vuoi usarlo come una data invece che varchardopo, non dimenticare di riconvertirlo:

select convert(datetime,CONVERT(char(10), GetDate(),126))

questo non lo convertirà nel formato predefinito di sistema?
Ignas Vyšnia,

3

Non sono sicuro del motivo per cui il modo più semplice è stato ignorato / omesso nelle risposte sopra:

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

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

Preferisco la seconda perché qualunque lingua tu parli, capirai che data è!

Inoltre, SQL Server lo "capisce" sempre quando lo invii alla tua procedura di salvataggio, indipendentemente dai formati regionali impostati nei computer: utilizzo sempre l'anno intero (aaaa), il nome del mese (MMM) e il formato 24 ore (HH maiuscolo) per ora nella mia programmazione.


2

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


1
perché usare NVARCHAR (20)? potrebbero esserci personaggi speciali?
KM.

Preferisco usare UNICODE. Mos dei miei progetti internazionali ;-)
Dmitri Kouminov,

2

Puoi anche usare. Questo è usando il nuovo tipo di dati DATE. Potrebbe non funzionare in tutte le versioni precedenti, ma notevolmente semplificato per l'uso nella versione successiva.

SELECT CAST(getdate() AS DATE)
SELECT LEFT(CAST(getdate() AS DATE), 7)

1

Io userei:

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

Da SQL Server 2008 è possibile effettuare ciò: CONVERT(date,getdate())


1

Sembra inutile fare qualsiasi cosa strana, se vuoi che la tua data sia separata dalla barra. Basta scappare con una barra rovesciata. Altrimenti finirai con un punto.

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

Testato su SQL Server 2016


Dovresti testarlo per le prestazioni. FORMATO è generalmente 43 volte più lento di un CONVERT complicato.
Jeff Moden

0

L'uso di un'istruzione CASE per ciascuna delle funzioni convert / cast funziona sempre per me:

Sostituisci tableXXXXY con il nome della tabella e issueDate_dat con il nome del campo datetime in quella tabella:

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

Spero sia stato utile. chagbert.


0

Questa soluzione funziona per me, semplice ed efficace (anche con 126)

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

0

Se il formato della data di origine è tutto incasinato, prova qualcosa del tipo:

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;

Il codice sopra è usato per fornire una procedura di memorizzazione ai parametri sotto forma di mm / gg / aaaa
Raj Kumar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.