¿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.


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.


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

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


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)

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

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.


7

Otra forma ...

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

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

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

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


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


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.


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

¿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.


2

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


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)

1

Yo usaría:

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

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


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


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.


0

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

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

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

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;

El código anterior se utiliza para proporcionar un procedimiento de almacenamiento de parámetros en forma de mm / dd / aaaa
Raj Kumar
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.