2008-09-05 16 views
72

Necesito el mes + año de la fecha y hora en SQL Server como 'Ene 2008'. Estoy agrupando la consulta por mes, año. He buscado y encontrado funciones como datepart, convert, etc., pero ninguna de ellas me parece útil. ¿Me estoy perdiendo de algo? ¿Hay una función para esto?Obtener mes y año a partir de una fecha y hora en SQL Server 2005

+0

@Evan Carroll - ¿Esto constituye un secuestro de la pregunta? Si tiene una respuesta superior a la pregunta, ¿no se debe proporcionar como respuesta a la pregunta en lugar de señalar a la gente una pregunta diferente? – STLDeveloper

+0

@STLDeveloper cómo es el secuestro. La pregunta llama para 2005? No lo puse ahí. No estoy buscando 2005 ... Desafortunadamente, la mejor respuesta aquí no funciona en 2005, es 2012-explícita. ¿Debo desvirtuar las respuestas de 2005 por ser arcaico? –

+0

@STLDeveloper en realidad, no me importa aquí. =) mi postura oficial siempre ha sido aconsejar a las personas a utilizar PostgreSQL, no estoy seguro de por qué estoy tratando de ayudar. –

Respuesta

68

Si quiere decir que quiere que vuelvan como una cadena, en ese formato;

SELECT 
    CONVERT(CHAR(4), date_of_birth, 100) + CONVERT(CHAR(4), date_of_birth, 120) 
FROM customers 

Here are the other format options

+0

Intenté usar CONVERT (CHAR (4), GetDate(), 100) en mi SQL Server y en su lugar obtuve "09 1". Obtuve el espacio y un "1" para el 17. usando "seleccionar CONVERT (varchar, GetDate(), 100)" yield "09 17 2009 4:59 PM" – Nap

+1

Eso es raro - de los documentos a los que he vinculado, 100 debe devolver una abreviatura de tres letras del mes y un espacio, si se coloca en un CHAR (4). Pero luego, el resultado que ha publicado para CONVERT (varchar, getdate(), 100) parece diferente de lo que esperaría ver. ¿Qué versión de SQLServer estás usando? ¿Qué configuración de localización/internacionalización está utilizando (no es que esto debería importar a un formato 100). – robsoft

4

Ese formato no existe. Necesita hacer una combinación de dos cosas,

select convert(varchar(4),getdate(),100) + convert(varchar(4),year(getdate())) 
163
select 
datepart(month,getdate()) -- integer (1,2,3...) 
,datepart(year,getdate()) -- integer 
,datename(month,getdate()) -- string ('September',...) 
+0

Entonces, creo que esto es lo que quiero, pero no veo cómo TSQL podría entender la diferencia entre 'datepart (month, getdate())' y 'datepart (year, getdate())'. ¿Qué son ** mes ** y ** año **? – jp2code

+4

@ jp2code ** month ** y ** year ** son básicamente constantes definidas aquí: http://msdn.microsoft.com/en-us/library/ms174420.aspx. TSQL los entiende de la misma manera que usted, leyéndolos :) –

+1

LOL - Gracias Zach. Estuve mucho tiempo mirando eso antes de descubrirlo en un sitio diferente. – jp2code

5
(Month(Created) + ',' + Year(Created)) AS Date 
11

divertido, estaba simplemente jugando escribir esta misma consulta en SQL Server y, a continuación LINQ.

SELECT 
    DATENAME(mm, article.Created) AS Month, 
    DATENAME(yyyy, article.Created) AS Year, 
    COUNT(*) AS Total 
FROM Articles AS article 
GROUP BY 
    DATENAME(mm, article.Created), 
    DATENAME(yyyy, article.Created) 
ORDER BY Month, Year DESC 

Produce la siguiente salida (ejemplo).

Month | Year | Total 

January | 2009 | 2 
1

que tenían el mismo problema y después de mirar encontré esto:

SELECT DATENAME(yyyy, date) AS year 
FROM Income 
GROUP BY DATENAME(yyyy, date) 

Está funcionando muy bien!

5

¿Qué tal esto?

Select DateName(Month, getDate()) + ' ' + DateName(Year, getDate()) 
0

Sí, puede utilizar datename(month,intime) para obtener el mes en el texto.

11

Uso:

select datepart(mm,getdate()) --to get month value 
select datename(mm,getdate()) --to get name of month 
-3

Los siguientes funciona perfectamente! Lo acabo de usar, pruébalo.

date_format(date,'%Y-%c') 
+2

esta no es una función o declaración de servidor sql válida –

1

la conversión de la fecha al primer día del mes le permite agrupar Por y orden de un solo atributo, y es más rápido en mi experiencia.

declare @mytable table(mydate datetime) 
declare @date datetime 
set @date = '19000101' 
while @date < getdate() begin 
    insert into @mytable values(@date) 
    set @date = dateadd(day,1,@date) 
end 

select count(*) total_records from @mytable 

select dateadd(month,datediff(month,0,mydate),0) first_of_the_month, count(*) cnt 
from @mytable 
group by dateadd(month,datediff(month,0,mydate),0) 
1
---Lalmuni Demos--- 
create table Users 
(
userid int,date_of_birth date 
) 
---insert values--- 
insert into Users values(4,'9/10/1991') 

select DATEDIFF(year,date_of_birth, getdate()) - (CASE WHEN (DATEADD(year, DATEDIFF(year,date_of_birth, getdate()),date_of_birth)) > getdate() THEN 1 ELSE 0 END) as Years, 
MONTH(getdate() - (DATEADD(year, DATEDIFF(year, date_of_birth, getdate()), date_of_birth))) - 1 as Months, 
DAY(getdate() - (DATEADD(year, DATEDIFF(year,date_of_birth, getdate()), date_of_birth))) - 1 as Days, 
from users 
1
cast(cast(sq.QuotaDate as date) as varchar(7)) 

da "2006-04" formato

3

la mejor manera de hacerlo es con:

dateadd(month,datediff(month,0,*your_date*),0) 

que se mantendrá el tipo de fecha y hora

+0

Esta es, de lejos, la mejor respuesta para forzar cualquier fecha que sea solo el mes y el año, ignorando los componentes de día y hora. Mucho mejor que la respuesta aceptada porque la información se puede ordenar correctamente y funciona correctamente como una fecha en las herramientas de informes posteriores. –

26

A partir de SQL Server 2012, puede usar:

SELECT FORMAT(@date, 'yyyyMM') 
+0

Bien jugado señor ... esto respondió mi pregunta en 2012 –

+0

Me alegro de haber desplazado hasta aquí, esto es simple y ordenado. ¡Gracias! – Niklas

+0

Esta es una valiosa contribución, pero debería haber sido respondida en otro lugar, http://stackoverflow.com/a/43196370/124486 –

0

La pregunta es sobre SQL Server 2005, muchas de las respuestas aquí son para la versión posterior de SQL Server.

select convert (varchar(7), getdate(),20) 
--Typical output 2015-04 

SQL Server 2005 no tiene función de la fecha which was introduced in SQL Server 2008

0
,datename(month,(od.SHIP_DATE)) as MONTH_ 

Respuesta: mes_ enero enero septiembre octubre diciembre octubre septiembre

5

En SQL Server 2012, a continuación se puede utilizar

seleccione FORMATO (getdate(), 'MMM aaaa')

Esto da exacta "Jun 2016"

0

devuelve el nombre completo del mes, -, año completo, por ejemplo, March-2017

CONCAT(DATENAME(mm, GetDate()), '-', DATEPART(yy, GetDate())) 
+2

Ya hay otras 18 respuestas a esta pregunta. ¿Qué nueva información agrega tu respuesta? – stannius

0

Es un trabajo excelente.

DECLARE @pYear VARCHAR(4) 

DECLARE @pMonth VARCHAR(2) 

DECLARE @pDay VARCHAR(2) 

SET @pYear = RIGHT(CONVERT(CHAR(10), GETDATE(), 101), 4) 

SET @pMonth = LEFT(CONVERT(CHAR(10), GETDATE(), 101), 2) 

SET @pDay = SUBSTRING(CONVERT(CHAR(10), GETDATE(), 101), 4,2) 

SELECT @pYear,@pMonth,@pDay 
Cuestiones relacionadas