Convertir número de mes a función de nombre de mes en SQL

210

Tengo meses almacenados en SQL Server como 1,2,3,4, ... 12. Me gustaría mostrarlos como enero, febrero, etc. ¿Hay una función en SQL Server como MonthName (1) = enero? Estoy tratando de evitar una declaración CASE, si es posible.

Saif Khan
fuente

Respuestas:

158

Un poco hacky pero debería funcionar:

SELECT DATENAME(month, DATEADD(month, @mydate-1, CAST('2008-01-01' AS datetime)))
Alexander Kojevnikov
fuente
2
¿Por qué el '-1'? ¿Es necesario porque los meses en SQL Server están compensados ​​por uno?
Hassan Gulzar el
2
@ DoomerDGR8 en realidad es porque la fecha que se está utilizando para inicializar la función dateadd comienza en 1. si necesitamos el nombre de fecha de enero, estaríamos agregando 1 mes a 2008-01-01, lo que nos daría 2008-02-01, que es Febrero. entonces restamos 1 para dar cuenta de esto, y obtenemos enero nuevamente.
DForck42
Para evitar el problema de restar 1 de su fecha y hora, use una fecha y hora en diciembre en lugar de enero. Por ejemplo SELECT DATENAME (mes, DATEADD (mes, @mydate, CAST ('1978-12-01' AS datetime))
Steve Matthews
3
Esta es una buena información, pero en realidad no responde a la pregunta de cómo convertir un número de mes en un nombre de mes (más bien responde cómo obtener un nombre de mes a partir de una fecha). Has asumido que tiene el valor de fecha y hora en lugar de solo el número de mes; para que esto funcione, ahora necesita 'inventar' un valor de fecha / hora. Creo que la solución de leoinfo fue un poco más relevante
schizoid04
277

Creo que esta es la mejor manera de obtener el nombre del mes cuando tienes el número de mes

Select DateName( month , DateAdd( month , @MonthNumber , 0 ) - 1 )

O

Select DateName( month , DateAdd( month , @MonthNumber , -1 ) )
leoinfo
fuente
24
para fines de legibilidad, en realidad lo escribiría así: Seleccione DateName (mes, FechaAgregar (mes, @MonthNumber - 1, '1900-01-01'))
Valentino Vranken
10
una posible solución alternativa Seleccione DateName (mes, DateAdd (mes, @MonthNumber, -1))
Asif
44
Eso es perfecto. Esta debería ser la respuesta.
gotqn
94
SELECT DATENAME(month, GETDATE()) AS 'Month Name'
Dharamvir
fuente
3
Está obteniendo el nombre del mes por fecha, no por número de mes, como SO preguntó.
Imad
72
SUBSTRING('JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC ', (@intMonth * 4) - 3, 3)
Darryl Martin
fuente
9
¡Me gusta esta forma alternativa de pensar muy a la izquierda! Alimento para el pensamiento
Michael Rodrigues
2
¡Y es determinista! También se puede usar como columna calculada, ¡gracias!
Irawan Soetomo
1
agradable ... estaba buscando un código simple para obtener meses desde enero hasta [#] y esto funcionó muy bien. para mostrar varios meses, simplemente cambie a algo como esto >> SUBSTRING ('ENE FEB MAR ABR MAY JUN JUL AGO SEP OCT NOV DIC', 0, (@intMonth * 4))
Pablo Contreras
2
Definitivamente no pensaría en esto como la "forma correcta", pero es una forma divertida que podría usarse para resolver otros problemas.
Paul
31

Usa la mejor manera

Select DateName( month , DateAdd( month , @MonthNumber , -1 ))
Como si
fuente
21

Es muy simple.

select DATENAME(month, getdate())

salida: enero

Saeed ur Rehman
fuente
44
Esto solo funciona si tiene un valor de fecha completo, no un mes entero.
gunr2171
2
Esta no es una respuesta a la pregunta. Él está preguntando cómo implementar una función como MonthName (1).
amuliar
8

Puedes usar la CONVERTfunción incorporada

select CONVERT(varchar(3), Date, 100)  as Month from MyTable.

Esto mostrará los primeros 3 caracteres del mes (ENE, FEB, etc.)

Marcus
fuente
7

además del original

SELECT DATENAME(m, str(2) + '/1/2011')

Puedes hacerlo

SELECT DATENAME(m, str([column_name]) + '/1/2011')

de esta manera obtienes nombres para todas las filas de una tabla. donde [nombre_columna] representa una columna entera que contiene el valor numérico del 1 al 12

2 representa cualquier número entero, por cadena de contacto creé una fecha donde puedo extraer el mes. '/ 1/2011' puede ser cualquier fecha

si quieres hacer esto con variable

DECLARE @integer int;

SET @integer = 6;

SELECT DATENAME(m, str(@integer) + '/1/2011')

fuente
7

Lo siguiente funciona para mí:

CAST(GETDATE() AS CHAR(3))
unitario
fuente
6

Use esta declaración para convertir el valor numérico del mes al nombre del mes.

SELECT CONVERT(CHAR(3), DATENAME(MONTH, GETDATE()))
Ashish Singh
fuente
A menos que me equivoque, esto no es usar un número entero, como preguntó el OP.
influyente
5

En algunos entornos locales como el hebreo, hay meses bisiestos que dependen del año, por lo que para evitar errores en dichos entornos locales, puede considerar la siguiente solución:

SELECT DATENAME(month, STR(YEAR(GETDATE()), 4) + REPLACE(STR(@month, 2), ' ', '0') + '01')     
Jim Burger
fuente
1
¿Hay una función para convertir una fecha a una fecha judía en SQL? No es que yo sepa de ...
Hila DG
función para convertir a la fecha judía: blogs.microsoft.co.il/gerireshef/2011/03/29/…
AJ AJ
5

Claro que esto funcionará

select datename(M,GETDATE())
Shyam Sa
fuente
5

A partir de SQL Server 2012, puede usar FORMAT y DATEFROMPARTS para resolver este problema. (Si desea nombres de los meses de otras culturas, cambie: en-US)

select FORMAT(DATEFROMPARTS(1900, @month_num, 1), 'MMMM', 'en-US')

Si quieres un mes de tres letras:

select FORMAT(DATEFROMPARTS(1900, @month_num, 1), 'MMM', 'en-US')

Si realmente quieres, puedes crear una función para esto:

CREATE FUNCTION fn_month_num_to_name
(
    @month_num tinyint
)
RETURNS varchar(20)
AS
BEGIN
    RETURN FORMAT(DATEFROMPARTS(1900, @month_num, 1), 'MMMM', 'en-US')
END
Pablo
fuente
Esto es lo que estoy buscando. Gracias por la solución.
Abdullah Al Mamun
Probablemente no sea la más eficiente, pero probablemente sea la más fácil de leer.
Paul
1
¡Incluso admite localización! ... ¡dulce!
Rosdi Kasim
4

Puede usar la función de conversión de la siguiente manera

CONVERT(VARCHAR(3), DATENAME(MM, GETDATE()), 100)
Nori
fuente
4

Simplemente reste el mes actual de la fecha de hoy, luego vuelva a agregar su número de mes. Luego use la función datename para dar el nombre completo en 1 línea.

print datename(month,dateadd(month,-month(getdate()) + 9,getdate()))
Geoffrey Fuller
fuente
3

Creo que esto es suficiente para obtener el nombre del mes cuando tienes fecha.

SELECT DATENAME(month ,GETDATE())
Benazir
fuente
3
SELECT DateName(M, DateAdd(M, @MONTHNUMBER, -1))
Isaias
fuente
3

Para convertir el número del mes al nombre del mes, intente lo siguiente

declare @month smallint = 1
select DateName(mm,DATEADD(mm,@month - 1,0))
M2012
fuente
3
SELECT DATENAME(MONTH,dateadd(month, -3,getdate()))
gvila
fuente
1

Este me funcionó:

@MetricMonthNumber (some number)

SELECT 
(DateName( month , DateAdd( month , @MetricMonthNumber - 1 , '1900-01-01' ) )) AS MetricMonthName
FROM TableName

De una publicación anterior de @leoinfo y @Valentino Vranken. Acabo de hacer una selección rápida y funciona.

Roadrunner327
fuente
1
Declare @MonthNumber int
SET @MonthNumber=DatePart(Month,GETDATE())
Select DateName( month , DateAdd( month , @MonthNumber , 0 ) - 1 )

Explicacion:

  1. Variable primera calcomanía MonthNumber
  2. Obtener el mes actual para el DatePartque se devuelve el número de mes
  3. Nombre del mes de devolución de la tercera consulta
Wafa Abbas
fuente
1
select monthname(curdate());

O

select monthname('2013-12-12');
Piyush
fuente
1

Trabajando para mi

SELECT MONTHNAME(<fieldname>) AS "Month Name" FROM <tablename> WHERE <condition>
Kashif Aslam
fuente
1

puedes obtener la fecha como esta. por ejemplo: - Tabla de usuarios

id name created_at
1  abc  2017-09-16
2  xyz  2017-06-10

puedes obtener el nombre del mes como este

select year(created_at), monthname(created_at) from users;

salida

+-----------+-------------------------------+
| year(created_at) | monthname(created_at)  |
+-----------+-------------------------------+
|      2017        | september              |
|      2017        | june                   |
Janaka Pushpakumara
fuente
Puede encontrar documentación aquí. w3resource.com/mysql/date-and-time-functions/…
Janaka Pushpakumara
el OP pidió sql-server no mysql.
tavalendo
0

Use esta declaración para obtener el nombre del mes:

DECLARE @date datetime
SET @date='2015/1/4 00:00:00'

SELECT CAST(DATENAME(month,@date )  AS CHAR(3))AS 'Month Name'

Esto te dará un nombre de mes corto. Así: enero, febrero, marzo, etc.

usuario4972370
fuente
0

Aquí está mi solución usando información de otros para resolver un problema.

datename(month,dateadd(month,datepart(month,Help_HelpMain.Ticket_Closed_Date),-1)) as monthname
lancepants28
fuente
0

No hay una función definida por el sistema en el servidor SQL. Pero puede crear su propia función definida por el usuario, una función escalar. Encontrará funciones escalares en el Explorador de objetos para su base de datos: Programabilidad-> Funciones-> Funciones con valores escalares. A continuación, uso una variable de tabla para unir todo.

--Create the user-defined function
CREATE FUNCTION getmonth (@num int)
RETURNS varchar(9) --since 'September' is the longest string, length 9
AS
BEGIN

DECLARE @intMonth Table (num int PRIMARY KEY IDENTITY(1,1), month varchar(9))

INSERT INTO @intMonth VALUES ('January'), ('February'), ('March'), ('April'), ('May')
                           , ('June'), ('July'), ('August') ,('September'), ('October')
                           , ('November'), ('December')

RETURN (SELECT I.month
        FROM @intMonth I
        WHERE I.num = @num)
END
GO

--Use the function for various months
SELECT dbo.getmonth(4) AS [Month]
SELECT dbo.getmonth(5) AS [Month]
SELECT dbo.getmonth(6) AS [Month]
Charlie Brown
fuente
0

Puede crear una función como esta para generar el Mes y hacer SELECT dbo.fn_GetMonthFromDate (date_column) como Month FROM table_name


/****** Object:  UserDefinedFunction [dbo].[fn_GetMonthFromDate]    Script Date: 11/16/2018 10:26:33 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[fn_GetMonthFromDate] 
(@date datetime)
RETURNS varchar(50)
AS
BEGIN
    DECLARE @monthPart int

SET @monthPart = MONTH(@date) IF @monthPart = 1 BEGIN RETURN 'January' END ELSE IF @monthPart = 2 BEGIN RETURN 'February' END ELSE IF @monthPart = 3 BEGIN RETURN 'March' END ELSE IF @monthPart = 4 BEGIN RETURN 'April' END ELSE IF @monthPart = 5 BEGIN RETURN 'May' END ELSE IF @monthPart = 6 BEGIN RETURN 'June' END ELSE IF @monthPart = 7 BEGIN RETURN 'July' END ELSE IF @monthPart = 8 BEGIN RETURN 'August' END ELSE IF @monthPart = 9 BEGIN RETURN 'September' END ELSE IF @monthPart = 10 BEGIN RETURN 'October' END ELSE IF @monthPart = 11 BEGIN RETURN 'November' END ELSE IF @monthPart = 12 BEGIN RETURN 'December' END RETURN NULL END
Seth Winters
fuente
0

La forma más fácil es llamando a la función MONTHNAME(your_date). your_date puede ser un valor estático o el valor de uno de los campos de su tabla.

Armand Mamitiana Rakotoarisoa
fuente
0

SELECCIONE NOMBRE DEL MES (concat ('1970 -', [Mes int val], '- 01'))

ejemplo- SELECCIONE NOMBRE DEL MES (concat ('1970 -', 4, '- 01'))

respuesta- abril

Atanu Samanta
fuente