Konvertieren Sie die Monatsnummer in die Monatsnamenfunktion in SQL

210

Ich habe Monate in SQL Server als 1,2,3,4, ... 12 gespeichert. Ich möchte sie als Januar, Februar usw. anzeigen. Gibt es in SQL Server eine Funktion wie MonthName (1) = January? Ich versuche, eine CASE-Anweisung nach Möglichkeit zu vermeiden.

Saif Khan
quelle

Antworten:

158

Ein bisschen hacky sollte aber funktionieren:

SELECT DATENAME(month, DATEADD(month, @mydate-1, CAST('2008-01-01' AS datetime)))
Alexander Kojevnikov
quelle
2
Warum die '-1'? Wird das benötigt, weil die Monate in SQL Server um eins versetzt sind?
Hassan Gulzar
2
@ DoomerDGR8 liegt es tatsächlich daran, dass das Datum, an dem die dateadd-Funktion gesetzt wird, bei 1 beginnt. Wenn wir den Dateinamen für Januar benötigen, würden wir dem 01.01.2008 einen Monat hinzufügen, was uns den 01.02.2008 ergibt Februar. Also subtrahieren wir 1, um dies zu berücksichtigen, und wir bekommen wieder Januar.
DForck42
Verwenden Sie eine Datums- und Uhrzeitangabe im Dezember anstelle von Januar, um das Problem des Subtrahierens von 1 von Ihrer Datumszeit zu umgehen. Zum Beispiel SELECT DATENAME (Monat, DATEADD (Monat, @mydate, CAST ('1978-12-01' AS datetime)))
Steve Matthews
3
Dies ist eine gute Information, beantwortet jedoch nicht die Frage, wie eine Monatsnummer in einen Monatsnamen konvertiert werden kann (beantwortet eher, wie ein Monatsname von einem Datum abgerufen wird). Sie haben angenommen, dass er den Datum / Uhrzeit-Wert und nicht nur die Monatszahl hat. Damit dies funktioniert, müssen Sie jetzt einen Datums- / Zeitwert „erfinden“. Denken Sie, dass die Lösung von Leoinfo etwas relevanter war
schizoid04
277

Ich denke, dies ist der beste Weg, um den Monatsnamen zu erhalten, wenn Sie die Monatsnummer haben

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

Oder

Select DateName( month , DateAdd( month , @MonthNumber , -1 ) )
Leoinfo
quelle
24
Aus Gründen der Lesbarkeit würde ich es tatsächlich so schreiben: Wählen Sie DateName (Monat, DateAdd (Monat, @MonthNumber - 1, '1900-01-01'))
Valentino Vranken
10
eine mögliche alternative Lösung Wählen Sie DateName (Monat, DateAdd (Monat, @MonthNumber, -1))
Asif
4
Das ist perfekt. Dies sollte die Antwort sein.
Gotqn
94
SELECT DATENAME(month, GETDATE()) AS 'Month Name'
Dharamvir
quelle
3
Es wird der Monatsname nach Datum und nicht nach der Monatsnummer angezeigt, wie SO gefragt hat.
Imad
72
SUBSTRING('JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC ', (@intMonth * 4) - 3, 3)
Darryl Martin
quelle
9
Ich mag diese alternative Denkweise auf der linken Seite! Denkanstöße
Michael Rodrigues
2
Und es ist deterministisch! Kann auch als berechnete Spalte verwendet werden, danke!
Irawan Soetomo
1
nett ... ich suchte nach einem einfachen Code, um Monate von Januar bis [#] zu bekommen, und das funktionierte großartig. Um mehrere Monate anzuzeigen, wechseln Sie einfach zu so etwas >> SUBSTRING ('JAN FEB MAR APR MAI JUNI JUL AUG SEP OKT NOV DEZ', 0, (@intMonth * 4))
Pablo Contreras
2
Ich würde dies definitiv nicht als den "richtigen Weg" betrachten, aber es ist ein lustiger Weg, der zur Lösung anderer Probleme verwendet werden könnte.
Paul
31

Verwenden Sie den besten Weg

Select DateName( month , DateAdd( month , @MonthNumber , -1 ))
Als ob
quelle
21

Es ist sehr einfach.

select DATENAME(month, getdate())

Ausgabe: Januar

Saeed ur Rehman
quelle
4
Dies funktioniert nur, wenn Sie einen vollständigen Datumswert und keine Monats-Ganzzahl haben.
gunr2171
2
Dies ist keine Antwort auf die Frage. Er fragt, wie man eine Funktion wie MonthName (1) implementiert.
eigenartig
8

Sie können die eingebaute CONVERTFunktion verwenden

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

Dies zeigt die ersten 3 Zeichen des Monats an (JAN, FEB usw.)

Marcus
quelle
7

zusätzlich zum Original

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

du kannst das

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

Auf diese Weise erhalten Sie Namen für alle Zeilen in einer Tabelle. Dabei steht [Spaltenname] für eine ganzzahlige Spalte mit den numerischen Werten 1 bis 12

2 stellt eine beliebige Ganzzahl dar. Durch Kontaktzeichenfolge habe ich ein Datum erstellt, an dem ich den Monat extrahieren kann. '/ 1/2011' kann ein beliebiges Datum sein

wenn Sie dies mit Variable tun möchten

DECLARE @integer int;

SET @integer = 6;

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

quelle
7

Folgendes funktioniert für mich:

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

Verwenden Sie diese Anweisung, um den numerischen Wert des Monats in den Namen des Monats umzuwandeln.

SELECT CONVERT(CHAR(3), DATENAME(MONTH, GETDATE()))
Ashish Singh
quelle
Sofern ich mich nicht irre, wird hier keine Ganzzahl verwendet, wie vom OP verlangt.
Einfluss
5

In einigen Regionen wie Hebräisch gibt es Schaltmonate , die vom Jahr abhängen. Um Fehler in solchen Regionen zu vermeiden, sollten Sie die folgende Lösung in Betracht ziehen:

SELECT DATENAME(month, STR(YEAR(GETDATE()), 4) + REPLACE(STR(@month, 2), ' ', '0') + '01')     
Jim Burger
quelle
1
Gibt es eine Funktion zum Konvertieren eines Datums in ein jüdisches Datum in SQL? Nicht dass ich wüsste von ...
Hila DG
Funktion zum Konvertieren in jüdisches Datum: blogs.microsoft.co.il/gerireshef/2011/03/29/…
AJ AJ
5

Sicher wird das funktionieren

select datename(M,GETDATE())
Shyam Sa.
quelle
5

Ab SQL Server 2012 können Sie FORMAT und DATEFROMPARTS verwenden , um dieses Problem zu lösen. (Wenn Sie möchten , Monatsnamen aus anderen Kulturen, ändern: en-US)

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

Wenn Sie einen Monat mit drei Buchstaben wünschen:

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

Wenn Sie wirklich wollen, können Sie eine Funktion dafür erstellen:

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
quelle
Das ist was ich suche. Vielen Dank für die Lösung.
Abdullah Al Mamun
Es ist wahrscheinlich nicht das effizienteste, aber wahrscheinlich das am leichtesten lesbare.
Paul
1
Es unterstützt sogar die Lokalisierung! .. süß!
Rosdi Kasim
4

Sie können die Konvertierungsfunktion wie folgt verwenden

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

Subtrahieren Sie einfach den aktuellen Monat vom heutigen Datum und addieren Sie dann Ihre Monatsnummer zurück. Verwenden Sie dann die Dateinamenfunktion, um den vollständigen Namen in einer Zeile anzugeben.

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

Ich denke, das ist genug, um den Namen des Monats zu bekommen, wenn du ein Datum hast.

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

Versuchen Sie Folgendes, um die Monatsnummer in den Monatsnamen umzuwandeln

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

Dieser hat für mich gearbeitet:

@MetricMonthNumber (some number)

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

Aus einem Beitrag oben von @leoinfo und @Valentino Vranken. Habe gerade eine schnelle Auswahl getroffen und es funktioniert.

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

Erklärung:

  1. First Decalre Variable MonthNumber
  2. Aktuellen Monat abrufen, für den DatePartdie Monatsnummer zurückgegeben wird
  3. Name des Rückgabemonats der dritten Abfrage
Wafa Abbas
quelle
1
select monthname(curdate());

ODER

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

Ich arbeite für mich

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

Sie können das Datum so erhalten. zB: - Benutzertabelle

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

Sie können den Monatsnamen so erhalten

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

Ausgabe

+-----------+-------------------------------+
| year(created_at) | monthname(created_at)  |
+-----------+-------------------------------+
|      2017        | september              |
|      2017        | june                   |
Janaka Pushpakumara
quelle
Dokumentation finden Sie hier. w3resource.com/mysql/date-and-time-functions/…
Janaka Pushpakumara
Das OP fragte nach SQL-Server, nicht nach MySQL.
Tavalendo
0

Verwenden Sie diese Anweisung, um den Monatsnamen abzurufen:

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

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

Dies gibt Ihnen einen kurzen Monatsnamen. So: Jan, Feb, Mar usw.

user4972370
quelle
0

Hier ist meine Lösung, bei der einige Informationen von anderen verwendet werden, um ein Problem zu lösen.

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

In SQL Server gibt es keine systemdefinierte Funktion. Sie können jedoch Ihre eigene benutzerdefinierte Funktion erstellen - eine Skalarfunktion. Sie finden Skalarfunktionen im Objekt-Explorer für Ihre Datenbank: Programmierbarkeit-> Funktionen-> Skalarwertfunktionen. Unten verwende ich eine Tabellenvariable, um alles zusammenzuführen.

--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
quelle
0

Sie können eine solche Funktion erstellen, um den Monat zu generieren und SELECT dbo.fn_GetMonthFromDate (date_column) als Month FROM table_name auszuführen


/****** 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
quelle
0

Am einfachsten ist es, die Funktion aufzurufen MONTHNAME(your_date). Ihr_Datum kann ein statischer Wert oder der Wert aus einem Ihrer Tabellenfelder sein.

Armand Mamitiana Rakotoarisoa
quelle
0

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

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

Antwort - April

Atanu Samanta
quelle