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?


@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


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

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


12

Utilizar:

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

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

9

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

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

Esto da un "junio de 2016" exacto


6

¿Qué tal esto?

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


5

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

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

4

la mejor manera de hacerlo es con:

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

mantendrá su tipo de fecha y hora


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

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!


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)

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

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


0

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


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

Respuesta: MES_ Enero Enero Septiembre Octubre Diciembre Octubre Septiembre


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

-3

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

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

2
esta no es una función o declaración válida del servidor sql
franko_camron
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.