Obtener mes y año de una fecha y hora en SQL Server 2005

87

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

Malik Daud Ahmad Khokhar
fuente
@Evan Carroll: ¿esto constituye secuestrar la pregunta? Si tiene una respuesta superior a la pregunta, ¿no debería proporcionarse como una respuesta a la pregunta en lugar de señalar a las personas una pregunta diferente?
STLDev
@STLDeveloper, ¿cómo es el secuestro? ¿La pregunta pide 2005? Yo no puse eso ahí. No estoy buscando 2005 .. Desafortunadamente, la mejor respuesta aquí no funciona en 2005, es 2012 explícita. ¿Debería rechazar las respuestas de 2005 por ser arcaicas?
Evan Carroll
@STLDeveloper en realidad, no me importa aquí. =) mi postura oficial siempre ha sido aconsejar a la gente que use PostgreSQL, no estoy seguro de por qué estoy tratando de ayudar.
Evan Carroll
Me pareció extraño que volviera a crear una nueva versión de la pregunta para una versión diferente del producto y luego respondiera esa pregunta, lo cual creo que está bien.
STLDev

Respuestas:

74

Si quiere decir que los quiere de vuelta como una cadena, en ese formato;

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

Aquí están las otras opciones de formato

robsoft
fuente
Intenté usar CONVERT (CHAR (4), GetDate (), 100) en mi SQL Server y obtuve "09 1" en su lugar. Obtuve el espacio y un "1" para el 17. usando "select CONVERT (varchar, GetDate (), 100)" yield "09 17 2009 4:59 PM"
Siesta
1
Eso es extraño: de los documentos a los que he vinculado, 100 debería devolver una abreviatura de mes de tres letras y un espacio, si se arroja en un CHAR (4). Pero luego, el resultado que ha publicado para CONVERT (varchar, getdate (), 100) se ve diferente a lo que esperaba ver. ¿Qué versión de SQLServer estás usando? ¿Qué configuración de localización / internacionalización está utilizando (no es que esto deba importar a un formato 100).
robsoft
171
select 
datepart(month,getdate()) -- integer (1,2,3...)
,datepart(year,getdate()) -- integer
,datename(month,getdate()) -- string ('September',...)
HS.
fuente
Entonces, creo que esto es lo que quiero, pero no veo cómo TSQL entendería la diferencia entre datepart(month,getdate())y datepart(year,getdate()). ¿Qué son mes y año ?
jp2code
4
@ jp2code mes y año son básicamente constantes definidas aquí: msdn.microsoft.com/en-us/library/ms174420.aspx . TSQL los entiende de la misma manera que usted, al leerlos :)
Zachary Yates
1
LOL - Gracias Zach. Lo protagonicé durante mucho tiempo antes de descubrirlo en un sitio diferente.
jp2code
Mucho más limpio que la función de conversión. #cleanCode
RBT
51

A partir de SQL Server 2012, puede usar:

SELECT FORMAT(@date, 'yyyyMM')
Rey carmesí
fuente
1
Bien jugado señor ... esto respondió a mi pregunta en 2012
Squ1rr3lz
Me alegro de haberme desplazado hasta aquí, esto es sencillo y ordenado. ¡Gracias!
Niklas
Esta es una contribución valiosa, pero debería haberse respondido en otra parte, stackoverflow.com/a/43196370/124486
Evan Carroll
12

Utilizar:

select datepart(mm,getdate())  --to get month value
select datename(mm,getdate())  --to get name of month
don
fuente
11

Es curioso, estaba jugando a escribir esta misma consulta en SQL Server y luego en 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 el siguiente resultado (ejemplo).

Month | Year | Total

January | 2009 | 2
Mike Geise
fuente
9

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

seleccione FORMAT (getdate (), 'MMM yyyy')

Esto da un "junio de 2016" exacto

constructor web
fuente
6

¿Qué tal esto?

Select DateName( Month, getDate() ) + ' ' + DateName( Year, getDate() )
GordyII
fuente
5
( Month(Created) + ',' + Year(Created) ) AS Date
Sampson
fuente
5

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

select convert(varchar(4),getdate(),100)  + convert(varchar(4),year(getdate()))
SQLMenace
fuente
4

la mejor manera de hacerlo es con:

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

mantendrá su tipo de fecha y hora

ciber cyber1621
fuente
1
Esta es, con mucho, la mejor respuesta para forzar que cualquier fecha 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 clasificar correctamente y funciona correctamente como una fecha en las herramientas de informes posteriores.
Jamie Thomas
Estoy totalmente de acuerdo en que esta es, con mucho, la mejor manera de comenzar el mes. Mantiene el tipo de datos datetime y deja la representación en el front-end, donde debería estar. Esta es la forma correcta de hacer cosas como agrupar filas por mes de un campo.
Jeff Breadner
2

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

CONCAT(DATENAME(mm, GetDate()), '-', DATEPART(yy, GetDate()))
RobertC
fuente
2
Ya hay otras 18 respuestas a esta pregunta. ¿Qué nueva información agrega su respuesta?
Stannius
1

Tuve el mismo problema y después de mirar alrededor encontré esto:

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

¡Está funcionando muy bien!

Peter Mortensen
fuente
1

Convertir la fecha al primero del mes le permite Agrupar por y Ordenar por 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)
Ron Smith
fuente
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
Lalmuni Singh
fuente
1
cast(cast(sq.QuotaDate as date) as varchar(7))

da formato "2006-04"

Gareth Thomas
fuente
1

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 la función de fecha que se introdujo en SQL Server 2008

Hammad Khan
fuente
0

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

Alok Kumar
fuente
0
  ,datename(month,(od.SHIP_DATE)) as MONTH_

Respuesta: MES_ Enero Enero Septiembre Octubre Diciembre Octubre Septiembre

Khmer Angkor
fuente
0

Funciona genial.

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
GanbatSu
fuente
-3

¡Lo siguiente funciona perfectamente! Lo acabo de usar, pruébalo.

date_format(date,'%Y-%c')
Matteo
fuente
2
esta no es una función o declaración válida del servidor sql
franko_camron