Преобразование номера месяца в функцию имени месяца в SQL


210

Я храню месяцы в SQL Server как 1,2,3,4, ... 12. Я хотел бы отобразить их как январь, февраль и т. Д. Есть ли в SQL Server такая функция, как MonthName (1) = январь? Я пытаюсь избежать заявления CASE, если это возможно.

Ответы:


158

Немного хакерский, но должен работать:

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

2
Почему «-1»? Это необходимо, потому что месяцы в SQL Server смещены на один?
Хасан Гульзар

2
@ DoomerDGR8 это на самом деле потому, что дата, которая используется для заполнения функции dateadd, начинается с 1. Если нам нужно имя даты января, мы добавим 1 месяц к 2008-01-01, что даст нам 2008-02-01, что февраль. поэтому мы вычитаем 1, чтобы учесть это, и мы снова получаем январь.
DForck42

Чтобы обойти проблему вычитания 1 из вашей даты и времени, используйте дату и время в декабре, а не в январе. Например, SELECT DATENAME (month, DATEADD (month, @mydate, CAST ('1978-12-01' AS datetime)))
Стив Мэтьюз

3
Это хорошая информация, но она не дает ответа на вопрос о том, как преобразовать номер месяца в название месяца (скорее ответит, как получить название месяца из даты). Вы предположили, что он имеет значение datetime, а не только номер месяца; чтобы заставить это работать, теперь вам нужно «изобрести» значение даты / времени. Думаю, что решение от leoinfo было более актуальным
schizoid04

277

Я думаю, что это лучший способ получить название месяца, когда у вас есть номер месяца

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

Или

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

24
для удобства чтения я бы написал так: выберите DateName (month, DateAdd (month, @MonthNumber - 1, '1900-01-01'))
Valentino Vranken

10
одно возможное альтернативное решение Выберите DateName (month, DateAdd (month, @MonthNumber, -1))
Asif

4
Отлично. Это должно быть ответом.
получил

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

3
Получается название месяца по дате, а не по номеру месяца.
Имад

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

9
Мне нравится этот очень левый полевой альтернативный способ мышления! Пища для размышлений
Майкл Родригес

2
И это детерминировано! Может быть использован как вычисляемый столбец, спасибо!
Ираван Соетомо

1
хорошо ... я искал какой-то простой код, чтобы получить месяцы от Яна до [#], и это сработало отлично. для отображения нескольких месяцев просто измените на что-то вроде этого >> SUBSTRING («Январь, февраль, май, июнь, июль, август, сентябрь, ноябрь, декабрь», 0, (@intMonth * 4))
Пабло Контрерас,

2
Я определенно не думаю об этом как о «правильном пути», но это забавный способ, который можно использовать для решения других проблем.
Paul


21

Это очень просто.

select DATENAME(month, getdate())

выходной: январь


4
Это работает, только если у вас есть полное значение даты, а не целое число месяца.
gunr2171

2
Это не ответ на вопрос. Он спрашивает, как реализовать такую ​​функцию, как MonthName (1).
amuliar

8

Вы можете использовать встроенную CONVERTфункцию

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

Это будет отображать первые 3 символа месяца (январь, февраль и т. Д.)


7

в дополнение к оригиналу

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

ты можешь сделать это

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

Таким образом, вы получите имена для всех строк в таблице. где [column_name] представляет целочисленный столбец, содержащий числовое значение от 1 до 12

2 представляет любое целое число, по строке контакта я создал дату, где я могу извлечь месяц. «/ 1/2011» может быть любой датой

если вы хотите сделать это с переменной

DECLARE @integer int;

SET @integer = 6;

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


6

Используйте этот оператор для преобразования числового значения месяца в название месяца.

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

Если я не ошибаюсь, это не использует целое число, как спросил ОП.
втекающий

5

В некоторых регионах, таких как иврит, существуют високосные месяцы, зависящие от года, поэтому во избежание ошибок в таких языках вы можете рассмотреть следующее решение:

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

1
Есть ли функция для преобразования даты в еврейскую дату в SQL? Не то чтобы я знал ...
Хила Д.Г.

функция для преобразования в еврейскую дату: blogs.microsoft.co.il/gerireshef/2011/03/29/…
AJ AJ


5

Начиная с SQL Server 2012, вы можете использовать FORMAT и DATEFROMPARTS для решения этой проблемы. (Если вы хотите названия месяцев из других культур, изменения: en-US)

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

Если вы хотите трехбуквенный месяц:

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

Если вы действительно хотите, вы можете создать функцию для этого:

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

Это то, что я ищу. Спасибо за решение.
Абдулла Аль Мамун

Это, вероятно, не самый эффективный, но, вероятно, самый легко читаемый.
Пол

1
Он даже поддерживает локализацию! .. сладко!
Росди Касим

4

Вы можете использовать функцию преобразования, как показано ниже

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

4

Просто вычтите текущий месяц из сегодняшней даты, а затем добавьте обратно номер месяца. Затем используйте функцию datename, чтобы дать полное имя все в 1 строке.

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

3

Я думаю, этого достаточно, чтобы получить название месяца, когда у вас есть дата.

SELECT DATENAME(month ,GETDATE())


3

Чтобы преобразовать номер месяца в название месяца, попробуйте ниже

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


1

Этот работал для меня:

@MetricMonthNumber (some number)

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

Из поста выше от @leoinfo и @Valentino Vranken. Просто сделал быстрый выбор, и это работает.


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

Explaination:

  1. Первая переменная Decalre MonthNumber
  2. Получить текущий месяц, для DatePartкоторого возвращается номер месяца
  3. Название месяца возврата третьего запроса



1

Вы можете получить дату, как это. Например: - Таблица пользователей

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

Вы можете получить название месяца, как это

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

вывод

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

Вы можете найти документацию здесь. w3resource.com/mysql/date-and-time-functions/…
Джанака Пушпакумара

ОП запросил sql-сервер, а не mysql.
tavalendo

0

Используйте это утверждение для получения названия месяца:

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

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

Это даст вам краткое название месяца. Как это: январь, февраль, мар и т. Д.


0

Вот мое решение, использующее некоторую информацию от других для решения проблемы.

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

0

В SQL-сервере нет системной функции. Но вы можете создать свою собственную пользовательскую функцию - скалярную функцию. Вы найдете скалярные функции в обозревателе объектов для вашей базы данных: Программируемость-> Функции-> Функции со скалярными значениями. Ниже я использую переменную таблицы, чтобы собрать все вместе.

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

Вы можете создать такую ​​функцию, чтобы сгенерировать Месяц и сделать SELECT dbo.fn_GetMonthFromDate (date_column) как Месяц ОТ имя_таблицы


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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.