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

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

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
217
0
1 063 748
32
Перейти к ответу Данный вопрос помечен как решенный

Ответы 32

Ответ принят как подходящий

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

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

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

Hassan Gulzar 01.11.2016 11:40

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

DForck42 05.12.2016 19:11

Чтобы обойти проблему вычитания 1 из даты и времени, используйте дату и время в декабре, а не в январе. Например, ВЫБЕРИТЕ ИМЯ ДАТЫ (месяц, ДОБАВИТЬ ДАТУ (месяц, @mydate, CAST ('1978-12-01' AS datetime)))

Steve Matthews 01.09.2017 16:26

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

schizoid04 04.06.2018 22:51

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

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

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

Hila DG 20.10.2016 06:45

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

AJ AJ 23.10.2018 13:08

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

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

Или же

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

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

Valentino Vranken 29.06.2010 10:50

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

Asif 13.08.2013 13:40

Это идеально. Это должен быть ответ.

gotqn 08.10.2013 17:35

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

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

Это отобразит первые 3 символа месяца (ЯНВАРЬ, ФЕВРАЛЬ и т. д.)

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

Он получает название месяца по дате, а не по номеру месяца, как просил SO.

Imad 17.04.2015 10:07

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

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

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

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

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

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

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

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

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

DECLARE @integer int;

SET @integer = 6;

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

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

@MetricMonthNumber (some number)

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

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

Используйте это заявление

SELECT TO_CHAR(current_date,'dd MONTH yyyy') FROM dual

это преобразует номер месяца в полную строку месяца

TO_CHAR () - это функция Oracle. OP использует SQL Server, который имеет другую, но эквивалентную функцию CONVERT.

APC 28.09.2011 20:04

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

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

Michael Rodrigues 22.02.2012 08:28

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

Irawan Soetomo 13.07.2012 11:37

хорошо ... я искал какой-то простой код, чтобы получить месяцы с января до [#], и это отлично сработало. для отображения нескольких месяцев просто измените на что-то вроде этого >> SUBSTRING ('ЯНВАРЬ ФЕВРАЛЬ МАРТ МАЙ ИЮНЬ ИЮЛЬ АВГУСТ СЕНТЯБРЬ ОКТЯБРЬ ДЕК', 0, (@intMonth * 4))

Pablo Contreras 26.03.2015 20:46

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

Paul 23.03.2018 17:18

to_char(to_date(V_MONTH_NUM,'MM'),'MONTH')

где V_MONTH_NUM - номер месяца

SELECT to_char(to_date(V_MONTH_NUM,'MM'),'MONTH')  from dual;

Похоже, это относится к Oracle. Сообщение помечено тегом SQL 2005.

Philter 03.06.2013 18:47

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

Объяснение:

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

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

SELECT DATENAME(month ,GETDATE())

Для меня работает следующее:

CAST(GETDATE() AS CHAR(3))

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

Используйте лучший способ

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

select monthname(curdate());

ИЛИ ЖЕ

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

Работаю на меня

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

Конечно, это сработает

select datename(M,GETDATE())

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

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

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

influent 30.11.2016 22:22

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

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

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

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

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

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

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

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

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

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

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

select DATENAME(month, getdate())

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

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

gunr2171 19.05.2017 16:40

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

amuliar 30.03.2018 11:08

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

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

вы можете получить дату вот так. например: - Таблица Пользователи

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

Janaka Pushpakumara 13.04.2018 12:09

OP запросил sql-server, а не mysql.

tavalendo 01.10.2018 13:31

Начиная с SQL Server 2012, вы можете использовать ФОРМАТ и ДАТА ЧАСТИ для решения этой проблемы. (Если вам нужны названия месяцев из других культур, измените: 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

Это то, что я ищу. Спасибо за решение.

Abdullah Al Mamun 23.12.2018 17:19

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

Paul 09.01.2019 02:01

Даже локализацию поддерживает! .. сладко!

Rosdi Kasim 25.04.2019 11:05

Вы можете создать такую ​​функцию, чтобы генерировать Месяц и делать ВЫБЕРИТЕ 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

Самый простой способ - вызвать функцию MONTHNAME(your_date). ваша_дата может быть статическим значением или значением одного из полей вашей таблицы.

Попробуйте это: SELECT MONTHNAME(concat('1970-',[Month int val],'-01'))

Например - SELECT MONTHNAME(concat('1970-',4,'-01'))

Ответ - апрель

Другие вопросы по теме