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.

Antworten:


158

Ein bisschen hacky sollte aber funktionieren:

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

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

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'

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)

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

21

Es ist sehr einfach.

select DATENAME(month, getdate())

Ausgabe: Januar


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


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

7

Folgendes funktioniert für mich:

CAST(GETDATE() AS CHAR(3))

6

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

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

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

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

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

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)

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

3

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

SELECT DATENAME(month ,GETDATE())

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

3

Versuchen Sie Folgendes, um die Monatsnummer in den Monatsnamen umzuwandeln

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

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

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.


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

1
select monthname(curdate());

ODER

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

1

Ich arbeite für mich

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

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                   |


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.


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

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]

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

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.


0

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

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

Antwort - April

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.