Konwertuj liczbę miesięcy na nazwę miesiąca w języku SQL


210

Mam miesiące przechowywane w SQL Server jako 1,2,3,4, ... 12. Chciałbym wyświetlić je jako styczeń, luty itp. Czy w SQL Server jest funkcja taka jak MonthName (1) = styczeń? W miarę możliwości staram się unikać instrukcji CASE.

Odpowiedzi:


158

Trochę zuchwały, ale powinien działać:

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

2
Dlaczego „-1”? Czy jest to potrzebne, ponieważ miesiące w SQL Server są przesunięte o jeden?
Hassan Gulzar

2
@ DoomerDGR8 to w rzeczywistości dlatego, że data używana do uruchomienia funkcji dateadd zaczyna się od 1. jeśli potrzebujemy styczniowej nazwy, dodalibyśmy 1 miesiąc do 01.01.2008, co dałoby nam 2008-02-01, czyli Luty. więc odejmujemy 1, aby uwzględnić to, i otrzymujemy ponownie styczeń.
DForck42,

Aby obejść problem odejmowania 1 od daty i godziny, użyj daty i godziny w grudniu, a nie w styczniu. Na przykład SELECT DATENAME (miesiąc, DATEADD (miesiąc, @mydate, CAST ('1978-12-01' AS datetime)))
Steve Matthews

3
Jest to dobra informacja, ale w rzeczywistości nie odpowiada na pytanie, jak przekonwertować numer miesiąca na nazwę miesiąca (raczej odpowiada, jak uzyskać nazwę miesiąca od daty). Zakładasz, że ma on wartość daty / godziny, a nie tylko numer miesiąca; aby to zadziałało, musisz teraz „wymyślić” wartość daty / godziny. Pomyśl, że rozwiązanie z Leoinfo było nieco bardziej odpowiednie
schizoid04

277

Myślę, że to najlepszy sposób na uzyskanie nazwy miesiąca, gdy masz numer miesiąca

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

Lub

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

24
w celu zapewnienia czytelności napisałbym to tak: Wybierz DateName (miesiąc, DateAdd (miesiąc, @MonthNumber - 1, '1900-01-01'))
Valentino Vranken

10
jedno możliwe alternatywne rozwiązanie Wybierz DateName (miesiąc, DateAdd (miesiąc, @MonthNumber, -1))
Asif

4
To idealne. To powinna być odpowiedź.
gotqn

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

3
Otrzymuje nazwę miesiąca według daty, a nie numeru miesiąca, zgodnie z SO.
Imad

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

9
Podoba mi się ten bardzo myślący alternatywny sposób myślenia! Jedzenie do namysłu
Michael Rodrigues

2
I to jest deterministyczne! Może być również używany jako kolumna obliczeniowa, dzięki!
Irawan Soetomo

1
fajnie ... szukałem prostego kodu, aby uzyskać miesiące od stycznia do [#] i to zadziałało świetnie. aby wyświetlić kilka miesięcy, wystarczy zmienić na coś takiego >> SUBSTRING ('JAN FEB MAR APR MAJ JUN JUL AUG SEP OCT NOV DEC', 0, (@intMonth * 4))
Pablo Contreras

2
Zdecydowanie nie uważałbym tego za „właściwą drogę”, ale jest to fajny sposób, który można wykorzystać do rozwiązania innych problemów.
Paul

31

Użyj najlepszego sposobu

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

21

To bardzo proste.

select DATENAME(month, getdate())

wyjście: styczeń


4
Działa to tylko wtedy, gdy masz pełną wartość daty, a nie liczbę całkowitą miesiąca.
gunr2171

2
To nie jest odpowiedź na pytanie. Pyta, jak zaimplementować funkcję taką jak MonthName (1).
amuliar

8

Możesz użyć wbudowanej CONVERTfunkcji

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

Spowoduje to wyświetlenie pierwszych 3 znaków miesiąca (JAN, FEB itp.)


7

oprócz oryginału

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

możesz to zrobić

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

w ten sposób otrzymujesz nazwy dla wszystkich wierszy w tabeli. gdzie [nazwa_kolumny] reprezentuje kolumnę całkowitą zawierającą wartości liczbowe od 1 do 12

2 reprezentuje dowolną liczbę całkowitą, poprzez ciąg kontaktowy utworzyłem datę, w której mogę wyodrębnić miesiąc. „/ 1/2011” może być dowolną datą

jeśli chcesz to zrobić ze zmienną

DECLARE @integer int;

SET @integer = 6;

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


6

Użyj tej instrukcji, aby przekonwertować wartość liczbową miesiąca na nazwę miesiąca.

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

Chyba, że ​​się mylę, nie jest to liczba całkowita, jak poprosił PO.
wpływowy

5

W niektórych lokalizacjach, takich jak hebrajski, miesiące przestępne zależą od roku, więc aby uniknąć błędów w takich lokalizacjach, możesz rozważyć następujące rozwiązanie:

SELECT DATENAME(month, STR(YEAR(GETDATE()), 4) + REPLACE(STR(@month, 2), ' ', '0') + '01')     

1
Czy jest funkcja konwersji daty na datę żydowską w SQL? Nie, żebym wiedział o ...
Hila DG

funkcja konwersji na datę żydowską: blogs.microsoft.co.il/gerireshef/2011/03/29/…
AJ AJ


5

Począwszy od SQL Server 2012, możesz użyć FORMATU i DATEFROMPARTS, aby rozwiązać ten problem. (Jeśli chcesz nazwy miesięcy z innych kultur, zmień en-US:)

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

Jeśli chcesz mieć trzyliterowy miesiąc:

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

Jeśli naprawdę chcesz, możesz utworzyć funkcję:

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

Właśnie tego szukam. Dziękuję za rozwiązanie.
Abdullah Al Mamun

Prawdopodobnie nie jest to najbardziej wydajny, ale prawdopodobnie najłatwiejszy do odczytania.
Paul

1
Obsługuje nawet lokalizację! .. słodki!
Rosdi Kasim

4

Możesz użyć funkcji konwersji jak poniżej

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

4

Po prostu odejmij bieżący miesiąc od dzisiejszej daty, a następnie dodaj swój numer miesiąca. Następnie użyj funkcji nazwy pliku, aby podać pełną nazwę w jednym wierszu.

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

3

myślę, że to wystarczy, aby uzyskać nazwę miesiąca, kiedy masz datę.

SELECT DATENAME(month ,GETDATE())


3

Aby przekonwertować numer miesiąca na nazwę miesiąca, spróbuj wykonać poniższe czynności

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


1

Ten działał dla mnie:

@MetricMonthNumber (some number)

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

Z powyższego postu z @leoinfo i @Valentino Vranken. Właśnie zrobiłem szybki wybór i działa.


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

Wyjaśnienie:

  1. Pierwsza zmienna decalre MonthNumber
  2. Uzyskaj bieżący miesiąc dla DatePart którego zwróć numer miesiąca
  3. Trzecie zapytanie Zwróć nazwę miesiąca

1
select monthname(curdate());

LUB

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

1

Pracuje dla mnie

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

1

możesz dostać taką datę. np .: - Tabela użytkowników

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

możesz uzyskać nazwę miesiąca w ten sposób

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

wynik

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


OP poprosił o serwer sql, a nie mysql.
tavalendo

0

Użyj tego oświadczenia, aby uzyskać nazwę miesiąca:

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

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

To da ci nazwę krótkiego miesiąca. W ten sposób: styczeń, luty, marzec itp.


0

Oto moje rozwiązanie wykorzystujące niektóre informacje od innych do rozwiązania problemu.

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

0

Na serwerze SQL nie ma funkcji zdefiniowanej przez system. Ale możesz stworzyć własną funkcję zdefiniowaną przez użytkownika - funkcję skalarną. Funkcje eksploratora obiektów można znaleźć w Eksploratorze obiektów dla bazy danych: Programowalność-> Funkcje-> Funkcje o wartości skalarnej. Poniżej używam zmiennej tabeli, aby połączyć to wszystko.

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

Możesz utworzyć taką funkcję, aby wygenerować miesiąc i wybrać WYBIERZ dbo.fn_GetMonthFromDate (kolumna_daty) jako miesiąc FROM nazwa_tabeli


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

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

przykład - WYBIERZ NAZWĘ MIESIĄCA (concat ('1970 -', 4, '- 01'))

odpowiedź - kwiecień

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.