Converti il ​​numero del mese in nome del mese Funzione in SQL


210

Ho mesi archiviati in SQL Server come 1,2,3,4, ... 12. Vorrei visualizzarli come gennaio, febbraio ecc. Esiste una funzione in SQL Server come MonthName (1) = gennaio? Sto cercando di evitare un'istruzione CASE, se possibile.

Risposte:


158

Un po 'confuso ma dovrebbe funzionare:

SELECT DATENAME(month, DATEADD(month, @mydate-1, CAST('2008-01-01' AS datetime)))

2
Perché il "-1"? È necessario perché i mesi in SQL Server sono compensati di uno?
Hassan Gulzar,

2
@ DoomerDGR8 è in realtà perché la data che viene utilizzata per eseguire il seeding della funzione dateadd inizia a 1. se abbiamo bisogno del nome dati di gennaio, aggiungeremmo 1 mese a 01-01-2008, che ci darebbe 2008-02-01, che è Febbraio. quindi sottraggiamo 1 per tener conto di ciò e otteniamo di nuovo gennaio.
DForck42,

Per aggirare il problema della sottrazione di 1 dal datetime, utilizzare un datetime a dicembre anziché a gennaio. Ad esempio SELEZIONA DATENAME (mese, DATEADD (mese, @mydate, CAST ('1978-12-01' AS datetime)))
Steve Matthews,

3
Questa è una buona informazione, ma non riesce effettivamente a rispondere alla domanda su come convertire un numero di mese in un nome di mese (Piuttosto risponde come ottenere un nome di mese da una data). Hai supposto che abbia il valore datetime piuttosto che solo il numero del mese; per farlo funzionare ora è necessario "inventare" un valore data / ora. Pensa che la soluzione di leoinfo fosse un po 'più pertinente
schizoid04

277

Penso che questo sia il modo migliore per ottenere il nome del mese quando hai il numero del mese

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

O

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

24
per motivi di leggibilità lo scriverei in questo modo: Seleziona DateName (mese, DateAdd (mese, @MonthNumber - 1, '1900-01-01'))
Valentino Vranken,

10
una possibile soluzione alternativa Seleziona DateName (mese, DateAdd (mese, @MonthNumber, -1))
Asif

4
È perfetto. Questa dovrebbe essere la risposta.
gotqn

94
SELECT DATENAME(month, GETDATE()) AS 'Month Name'

3
Sta ottenendo il nome del mese per data e non il numero del mese, come ha chiesto SO.
Imad,

72
SUBSTRING('JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC ', (@intMonth * 4) - 3, 3)

9
Mi piace questo modo di pensare alternativo molto a sinistra! Spunti di riflessione
Michael Rodrigues,

2
Ed è deterministico! Può essere usato anche come colonna calcolata, grazie!
Irawan Soetomo,

1
bello ... stavo cercando un codice semplice per ottenere mesi da gennaio a [#] e questo ha funzionato alla grande. per la visualizzazione di diversi mesi, basta passare a qualcosa del genere >> SUBSTRING ('JAN FEB MAR APR MAY JUN JUG AGO SETTEMBRE NOV DIC', 0, (@intMonth * 4))
Pablo Contreras

2
Sicuramente non lo considero il "modo giusto", ma è un modo divertente che potrebbe essere usato per risolvere altri problemi.
Paul,

31

Usa il modo migliore

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

21

È molto semplice.

select DATENAME(month, getdate())

uscita: gennaio


4
Funziona solo se hai un valore di data completo, non un numero intero di mese.
gunr2171,

2
Questa non è una risposta alla domanda. Sta chiedendo come implementare una funzione come MonthName (1).
amuliar

8

È possibile utilizzare la CONVERTfunzione integrata

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

Verranno visualizzati i primi 3 caratteri del mese (JAN, FEB ecc.)


7

oltre all'originale

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

Puoi farlo

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

in questo modo ottieni nomi per tutte le righe in una tabella. dove [nome_colonna] rappresenta una colonna intera contenente valori numerici da 1 a 12

2 rappresenta qualsiasi numero intero, per stringa di contatto ho creato una data in cui posso estrarre il mese. '/ 1/2011' può essere qualsiasi data

se vuoi farlo con variabile

DECLARE @integer int;

SET @integer = 6;

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

7

Per me funziona quanto segue:

CAST(GETDATE() AS CHAR(3))

6

Utilizzare questa istruzione per convertire il valore numerico del mese in nome del mese.

SELECT CONVERT(CHAR(3), DATENAME(MONTH, GETDATE()))

A meno che non mi sbagli, questo non utilizza un numero intero, come richiesto dall'OP.
influente il



5

A partire da SQL Server 2012, è possibile utilizzare FORMAT e DATEFROMPARTS per risolvere questo problema. (Se vuoi nomi di mesi di altre culture, cambia en-US:)

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

Se vuoi un mese di tre lettere:

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

Se vuoi davvero, puoi creare una funzione per questo:

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

Questo è quello che sto cercando. Grazie per la soluzione
Abdullah Al Mamun,

Probabilmente non è il più efficiente, ma è probabilmente il più facilmente leggibile.
Paul,

1
Supporta anche la localizzazione! .. dolce!
Rosdi Kasim,

4

È possibile utilizzare la funzione di conversione come di seguito

CONVERT(VARCHAR(3), DATENAME(MM, GETDATE()), 100)

4

Basta sottrarre il mese corrente dalla data odierna, quindi aggiungere nuovamente il numero del mese. Quindi utilizzare la funzione nome dati per dare il nome completo tutto in 1 riga.

print datename(month,dateadd(month,-month(getdate()) + 9,getdate()))

3

penso che questo sia sufficiente per ottenere il nome del mese quando hai una data.

SELECT DATENAME(month ,GETDATE())

3
SELECT DateName(M, DateAdd(M, @MONTHNUMBER, -1))

3

Per convertire il numero del mese in nome del mese, prova quanto segue

declare @month smallint = 1
select DateName(mm,DATEADD(mm,@month - 1,0))

3
SELECT DATENAME(MONTH,dateadd(month, -3,getdate()))

1

Questo ha funzionato per me:

@MetricMonthNumber (some number)

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

Da un post sopra di @leoinfo e @Valentino Vranken. Ho appena fatto una selezione rapida e funziona.


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

spiegazione:

  1. Prima variabile decalcomania MonthNumber
  2. Ottieni il mese corrente per il DatePartquale numero del mese di ritorno
  3. Nome mese di ritorno terza query

1
select monthname(curdate());

O

select monthname('2013-12-12');

1

Lavora per me

SELECT MONTHNAME(<fieldname>) AS "Month Name" FROM <tablename> WHERE <condition>

1

puoi ottenere la data in questo modo. ad es .: - Tabella utenti

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

puoi ottenere il nome del mese in questo modo

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

produzione

+-----------+-------------------------------+
| year(created_at) | monthname(created_at)  |
+-----------+-------------------------------+
|      2017        | september              |
|      2017        | june                   |


l'OP ha richiesto sql-server non mysql.
Tavalendo,

0

Usa questa affermazione per ottenere il nome del mese:

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

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

Questo ti darà il nome del mese breve. In questo modo: Jan, Feb, Mar, ecc.


0

Ecco la mia soluzione usando alcune informazioni di altri per risolvere un problema.

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

0

Non esiste una funzione definita dal sistema in SQL Server. Ma puoi creare la tua funzione definita dall'utente, una funzione scalare. Troverai funzioni scalari in Esplora oggetti per il tuo database: Programmabilità-> Funzioni-> Funzioni con valori scalari. Di seguito, utilizzo una variabile di tabella per riunire tutto.

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

0

È possibile creare una funzione come questa per generare il mese ed eseguire SELECT dbo.fn_GetMonthFromDate (date_column) come 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

0

Il modo più semplice è chiamando la funzione MONTHNAME(your_date). your_date può essere un valore statico o il valore di uno dei campi della tabella.


0

SELEZIONA MONTHNAME (concat ('1970 -', [Month int val], '- 01'))

esempio- SELEZIONA MONTHNAME (concat ('1970 -', 4, '- 01'))

risposta - aprile

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.