Convertir le numéro de mois en fonction de nom de mois en SQL

210

J'ai des mois stockés dans SQL Server comme 1,2,3,4, ... 12. Je voudrais les afficher comme janvier, février, etc. Y a-t-il une fonction dans SQL Server comme MonthName (1) = janvier? J'essaie d'éviter une déclaration CASE, si possible.

Saif Khan
la source

Réponses:

158

Un peu hacky mais ça devrait marcher:

SELECT DATENAME(month, DATEADD(month, @mydate-1, CAST('2008-01-01' AS datetime)))
Alexander Kojevnikov
la source
2
Pourquoi le «-1»? Est-ce nécessaire parce que les mois dans SQL Server sont compensés par un?
Hassan Gulzar
2
@ DoomerDGR8 c'est en fait parce que la date utilisée pour amorcer la fonction dateadd commence à 1. si nous avons besoin du nom de date de janvier, nous ajouterions 1 mois au 2008-01-01, ce qui nous donnerait le 2008-02-01, qui est Février. donc nous soustrayons 1 pour tenir compte de cela, et nous obtenons à nouveau janvier.
DForck42
Pour contourner le problème de la soustraction de 1 de votre datetime, utilisez une datetime en décembre plutôt que janvier. Par exemple, SELECT DATENAME (month, DATEADD (month, @mydate, CAST ('1978-12-01' AS datetime)))
Steve Matthews
3
Il s'agit d'une bonne information, mais elle ne répond pas réellement à la question de savoir comment convertir un numéro de mois en nom de mois (répond plutôt à la façon d'obtenir un nom de mois à partir d'une date). Vous avez supposé qu'il a la valeur datetime plutôt que simplement le numéro du mois; pour que cela fonctionne, vous devez maintenant «inventer» une valeur date / heure. Je pense que la solution de leoinfo était un peu plus pertinente
schizoid04
277

Je pense que c'est la meilleure façon d'obtenir le nom du mois lorsque vous avez le numéro du mois

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

Ou

Select DateName( month , DateAdd( month , @MonthNumber , -1 ) )
leoinfo
la source
24
à des fins de lisibilité, je l'écrirais comme ceci: Sélectionnez DateName (month, DateAdd (month, @MonthNumber - 1, '1900-01-01'))
Valentino Vranken
10
une solution alternative possible Sélectionnez DateName (month, DateAdd (month, @MonthNumber, -1))
Asif
4
C'est parfait. Cela devrait être la réponse.
gotqn
94
SELECT DATENAME(month, GETDATE()) AS 'Month Name'
Dharamvir
la source
3
Il obtient le nom du mois par date et non par numéro de mois, comme l'a demandé SO.
Imad
72
SUBSTRING('JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC ', (@intMonth * 4) - 3, 3)
Darryl Martin
la source
9
J'aime cette façon de penser alternative très à gauche! Matière à réflexion
Michael Rodrigues
2
Et c'est déterministe! Peut également être utilisé comme colonne calculée, merci!
Irawan Soetomo
1
sympa ... je cherchais du code simple pour obtenir des mois de janvier à [#] et cela a très bien fonctionné. pour afficher plusieurs mois, changez simplement quelque chose comme ceci >> SUBSTRING ('JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC', 0, (@intMonth * 4))
Pablo Contreras
2
Je ne verrais certainement pas cela comme la "bonne façon", mais c'est une façon amusante qui pourrait être utilisée pour résoudre d'autres problèmes.
Paul
31

Utilisez la meilleure façon

Select DateName( month , DateAdd( month , @MonthNumber , -1 ))
Comme si
la source
21

C'est très simple.

select DATENAME(month, getdate())

sortie: janvier

Saeed ur Rehman
la source
4
Cela ne fonctionne que si vous avez une valeur de date complète, pas un entier de mois.
gunr2171
2
Ce n'est pas une réponse à la question. Il demande comment implémenter une fonction comme MonthName (1).
2018 à 8h08
8

Vous pouvez utiliser la CONVERTfonction intégrée

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

Cela affichera les 3 premiers caractères du mois (JAN, FEB etc.)

Marcus
la source
7

en plus de l'original

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

tu peux le faire

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

de cette façon, vous obtenez des noms pour toutes les lignes d'une table. où [nom_colonne] représente une colonne entière contenant la valeur numérique 1 à 12

2 représente n'importe quel entier, par la chaîne de contact j'ai créé une date où je peux extraire le mois. '/ 1/2011' peut être n'importe quelle date

si vous voulez le faire avec une variable

DECLARE @integer int;

SET @integer = 6;

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

la source
7

Ce qui suit fonctionne pour moi:

CAST(GETDATE() AS CHAR(3))
unitario
la source
6

Utilisez cette instruction pour convertir la valeur numérique du mois en nom du mois.

SELECT CONVERT(CHAR(3), DATENAME(MONTH, GETDATE()))
Ashish Singh
la source
Sauf erreur, cela n'utilise pas un entier, comme l'OP l'a demandé.
influent
5

Dans certains pays comme l'hébreu, certains mois bissextiles dépendent de l'année. Pour éviter les erreurs dans ces pays, vous pouvez envisager la solution suivante:

SELECT DATENAME(month, STR(YEAR(GETDATE()), 4) + REPLACE(STR(@month, 2), ' ', '0') + '01')     
Jim Burger
la source
1
Existe-t-il une fonction pour convertir une date en date juive en SQL? Pas que je sache ...
Hila DG
fonction pour convertir en date juive: blogs.microsoft.co.il/gerireshef/2011/03/29/…
AJ AJ
5

Bien sûr, cela fonctionnera

select datename(M,GETDATE())
Shyam Sa
la source
5

À partir de SQL Server 2012, vous pouvez utiliser FORMAT et DATEFROMPARTS pour résoudre ce problème. (Si vous voulez que les noms de mois d'autres cultures, changement: en-US)

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

Si vous voulez un mois de trois lettres:

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

Si vous le voulez vraiment, vous pouvez créer une fonction pour cela:

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
Paul
la source
Voilà ce que je recherche. Merci pour la solution.
Abdullah Al Mamun
Ce n'est probablement pas le plus efficace, mais c'est probablement le plus lisible.
Paul
1
Il prend même en charge la localisation! .. doux!
Rosdi Kasim
4

Vous pouvez utiliser la fonction de conversion comme ci-dessous

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

Il suffit de soustraire le mois en cours de la date du jour, puis de rajouter votre numéro de mois. Utilisez ensuite la fonction datename pour donner le nom complet en une seule ligne.

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

Je pense que cela suffit pour obtenir le nom du mois lorsque vous avez une date.

SELECT DATENAME(month ,GETDATE())
Benazir
la source
3
SELECT DateName(M, DateAdd(M, @MONTHNUMBER, -1))
Isaïe
la source
3

Pour convertir le numéro du mois en nom du mois, essayez ce qui suit

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

Celui-ci a fonctionné pour moi:

@MetricMonthNumber (some number)

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

Extrait d'un post ci-dessus de @leoinfo et @Valentino Vranken. Je viens de faire une sélection rapide et cela fonctionne.

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

Explication:

  1. Variable First Decalre MonthNumber
  2. Obtenez le mois en cours pour DatePart quel numéro de mois de retour
  3. Nom du troisième mois de retour de requête
Wafa Abbas
la source
1
select monthname(curdate());

OU

select monthname('2013-12-12');
Piyush
la source
1

Travailler pour moi

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

vous pouvez obtenir la date comme ça. par exemple: - Tableau des utilisateurs

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

vous pouvez obtenir le nom de montagne comme celui-ci

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

production

+-----------+-------------------------------+
| year(created_at) | monthname(created_at)  |
+-----------+-------------------------------+
|      2017        | september              |
|      2017        | june                   |
Janaka Pushpakumara
la source
Vous pouvez trouver de la documentation ici. w3resource.com/mysql/date-and-time-functions/…
Janaka Pushpakumara
l'OP a demandé sql-server pas mysql.
tavalendo
0

Utilisez cette déclaration pour obtenir le nom du mois:

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

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

Cela vous donnera un nom de mois court. Comme ceci: Jan, Feb, Mar, etc.

user4972370
la source
0

Voici ma solution en utilisant des informations provenant d'autres personnes pour résoudre un problème.

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

Il n'y a pas de fonction définie par le système dans SQL Server. Mais vous pouvez créer votre propre fonction définie par l'utilisateur - une fonction scalaire. Vous trouverez des fonctions scalaires dans l'Explorateur d'objets pour votre base de données: Programmabilité-> Fonctions-> Fonctions à valeur scalaire. Ci-dessous, j'utilise une variable de table pour rassembler le tout.

--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
la source
0

Vous pouvez créer une fonction comme celle-ci pour générer le mois et faire SELECT dbo.fn_GetMonthFromDate (date_column) en tant que Month FROM nom_table


/****** 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
la source
0

La façon la plus simple consiste à appeler la fonction MONTHNAME(your_date). votre_date peut être une valeur statique ou la valeur d'un de vos champs de table.

Armand Mamitiana Rakotoarisoa
la source
0

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

exemple - SELECT MONTHNAME (concat ('1970 -', 4, '- 01'))

réponse - avril

Atanu Samanta
la source