¿Cómo obtener una fecha en formato AAAA-MM-DD desde un campo de fecha y hora TSQL?

260

¿Cómo recupero una fecha de SQL Server en YYYY-MM-DDformato? Necesito esto para trabajar con SQL Server 2000 y versiones posteriores. ¿Hay una manera simple de realizar esto en SQL Server o sería más fácil convertirlo mediante programación después de recuperar el conjunto de resultados?

He leído CAST y CONVERT en Microsoft Technet, pero el formato que quiero no aparece en la lista y cambiar el formato de fecha no es una opción.

Kinze
fuente
La descripción de BOL para 126 es un poco confusa (nunca encontré una explicación para "T").
nojetlag
La "T" separa la fecha de la hora. Ver ISO 8601 en Wikipedia
krubo

Respuestas:

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

Limitar el tamaño de las chuletas varchar de la porción de hora que no desea.

Darrel Miller
fuente
3
No, pero algunos clientes tienen problemas con la longitud fija.
gbn
55
Esta publicación aparece en Google para convertir a AAAAMMDD, de modo que uno es: CONVERTIR (char (10), GetDate (), 112)
NealWalters
1
Esto no funcionó para mí, la sugerencia anterior con un código 112 sí. Gracias @NealWalters
AlexVPerl
44
La lista de códigos enteros para estilos de salida: msdn.microsoft.com/en-us/library/ms187928.aspx
Ben Fransen
El código 126 es válido para fechas como la fecha de nacimiento en formato AAAA-mm-dd: CONVERT (char (10), pat_dob, 126) como 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
fuente
1
cómo obtener 'm / d / aaaa' en lugar de 'mm / dd / aaaa'
user_az
Esta es la respuesta más útil, de lejos.
Daniel
109

A partir de SQL Server 2012 (la pregunta original es para 2000):

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

Ignas Vyšnia
fuente
Esta es la forma flexible y sensata de hacer fecha / hora en versiones recientes de SQL utilizando formatos estándar de Dotnet. Recuerde capitalizar el mes MM para distinguir de los minutos. Todos los formatos de fecha y hora
jim birch
FORMATO se ejecuta (generalmente) 43 veces más lento que CONVERTIR. Le recomiendo que nunca (y no uso esa palabra a menudo) use FORMAT.
Jeff Moden hace
35

El formulario que busca aparece en la documentación en línea de los libros.

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

Por ejemplo, intente lo siguiente:

select convert(varchar,getDate(),120)
select convert(varchar(10),getDate(),120)
John Sansom
fuente
44
Si toma el valor predeterminado, en este caso, obtiene el valor de tiempo: el formato completo para el formato 120 es 'aaaa-mm-dd hh: mi: ss'. Al declarar explícitamente la longitud, se recorta al formato que especificó en su nota original: 'aaaa-mm-dd'.
DaveE
26

La convertfunción con el especificador de formato 120 le dará el formato "aaaa-MM-dd HH: mm: ss", por lo que solo tiene que limitar la longitud a 10 para obtener solo la parte de la fecha:

convert(varchar(10), theDate, 120)

Sin embargo, las fechas de formateo generalmente son mejores en la capa de presentación que en la capa de base de datos o de negocios. Si devuelve la fecha formateada desde la base de datos, entonces el código del cliente debe analizarla nuevamente en una fecha si necesita hacer algún cálculo en ella.

Ejemplo en C #:

theDate.ToString("yyyy-MM-dd")
Guffa
fuente
1
¿Por qué el voto negativo? Si no explica qué es lo que cree que está mal, no puede mejorar la respuesta.
Guffa
14

Para YYYYMMDD intente

select convert(varchar,getDate(),112)

Solo he probado en SQLServer2008.

LosManos
fuente
7

Otra forma ...

CONVERT(varchar, DATEPART(yyyy, @datetime)) + '/' + CONVERT(varchar, DATEPART(mm, @datetime)) + '/' + CONVERT(varchar, DATEPART(dd, @datetime)) 
Athadu
fuente
1
Esto creará fechas de 1 dígito como en 8/3/2012 si desea mm / dd de 2 dígitos, necesita dejar las fechas en el pad. RIGHT ('00 '+ CONVERT (varchar, DATEPART (aaaa, @datetime)), 2) por ejemplo
MindStalker
7

Para aquellos que quieran la parte del tiempo también (lo hice), el siguiente fragmento puede ayudar

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
usuario2431693
fuente
6
replace(convert(varchar, getdate(), 111), '/','-')

También hará truco sin "cortar nada".

Rafael Emshoff
fuente
Prefiero esta versión para evitar errores del "año 9999" asociados con la versión convert (varchar (10) ...).
Francis Huang
6

En caso de que alguien quiera hacerlo al revés y encuentre esto.

select convert(datetime, '12.09.2014', 104)

Esto convierte una cadena en el formato de fecha alemán en un objeto de fecha y hora.

¿Por qué 104? Ver aquí: http://msdn.microsoft.com/en-us/library/ms187928.aspx

Jenny O'Reilly
fuente
5

En su enlace de conversión y conversión, use el estilo 126 así:

CONVERT (varchar(10), DTvalue, 126)

Esto trunca el tiempo. Su requisito de tenerlo en aaaa-mm-dd significa que debe ser un tipo de datos de cadena y fecha y hora.

Francamente, lo haría en el cliente a menos que tenga buenas razones para no hacerlo.

gbn
fuente
4

Si desea usarlo como una fecha en lugar de una varcharvez más después, no olvide volver a convertirlo:

select convert(datetime,CONVERT(char(10), GetDate(),126))
Wayne Evans
fuente
¿No lo volvería a convertir al formato predeterminado del sistema?
Ignas Vyšnia
3

No estoy seguro de por qué la forma más simple ha sido ignorada / omitida en las respuestas anteriores:

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

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

¡Prefiero el segundo porque, sea cual sea el idioma que hable, comprenderá la fecha que es!

Además, SQL Server siempre lo 'entiende' cuando lo envía a su procedimiento de guardado, independientemente de qué formatos regionales estén configurados en las computadoras: siempre uso el año completo (aaaa), el nombre del mes (MMM) y el formato de 24 horas (capital HH) por hora en mi programación.

Hannington Mambo
fuente
2

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

Dmitri Kouminov
fuente
1
¿Por qué usar NVARCHAR (20)? ¿podría haber caracteres especiales allí?
KM.
Prefiero usar UNICODE. Mos of my projects international ;-)
Dmitri Kouminov
2

También puedes usar. Esto es mediante el uso del nuevo tipo de datos DATE. Puede no funcionar en todas las versiones anteriores, pero se simplifica enormemente su uso en versiones posteriores.

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

Yo usaría:

CONVERT(char(10),GETDATE(),126)
KM.
fuente
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
fuente
1

Desde SQL Server 2008 puede hacer esto: CONVERT(date,getdate())

Asher
fuente
1

Parece innecesario hacer cosas extrañas, si quieres que tu fecha sea separada por una barra. Solo escapa con una barra invertida. De lo contrario, terminarás con un punto.

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

Probado en SQL Server 2016

Cuilster
fuente
Debes probarlo para el rendimiento. FORMATO es generalmente 43 veces más lento que incluso un CONVERTIDO complicado.
Jeff Moden hace
0

Usar una declaración CASE para cada una de las funciones de conversión / conversión siempre funciona para mí:

Reemplace tableXXXXY con el nombre de su tabla y issueDate_dat con el nombre de su campo de fecha y hora en esa tabla:

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

Espero que esto haya sido útil. Chagbert.

Chagbert
fuente
0

Esta solución funciona para mí, simple y efectiva (con 126 también)

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

Si su formato de fecha de origen está desordenado, intente algo como:

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
Arnold
fuente
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
fuente
El código anterior se utiliza para proporcionar un procedimiento de almacenamiento de parámetros en forma de mm / dd / aaaa
Raj Kumar