Перетворити число місяця в функцію імені місяця в 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 - це насправді тому, що дата, яка використовується для виведення функції функції додавання дат, починається з 1. Якщо нам потрібне ім'я дати січня, ми додамо 1 місяць до 2008-01-01, що дасть нам 2008-02-01, що є Лютий. тому ми віднімаємо 1 для обліку цього, і знову отримуємо січень.
DForck42

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

3
Це хороша інформація, але вона фактично не відповідає на питання, як перетворити число місяця в назву місяця (Швидше відповідає на те, як отримати ім’я місяця з дати). Ви припустили, що він має значення дати, а не номер місяця; для того, щоб це працювало, вам зараз потрібно «винайти» значення дати / часу. Думаю, що рішення від leoinfo було дещо актуальнішим
schizoid04

277

Я думаю, що це найкращий спосіб отримати назву місяця, коли у вас є номер місяця

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

Або

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

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

10
одне можливе альтернативне рішення Виберіть DateName (місяць, DateAdd (місяць, @MonthNumber, -1))
Асиф

4
Це ідеально. Це має бути відповіддю.
gotqn

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
І це детерміновано! Також можна використовувати як обчислений стовпчик, дякую!
Irawan Soetomo

1
приємно ... Я шукав якийсь простий код, щоб отримати місяці від січня до [#], і це чудово спрацювало. для відображення декількох місяців, просто змініть щось на кшталт цього >> ПІДПРИЄМСТВО ("JAN FEB MAR КВ. Травень. ЧЕРВНЯ. липня. серпня. вересень. жовтня", 0, (@intMonth * 4))
Пабло Контрерас,

2
Я точно не вважав би це "правильним способом", але це цікавий спосіб, який можна використовувати для вирішення інших проблем.
Павло

31

Використовуйте кращий спосіб

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

21

Це дуже просто.

select DATENAME(month, getdate())

вихід: січень


4
Це працює лише в тому випадку, якщо ви маєте повне значення дати, а не ціле число місяця.
gunr2171

2
Це не відповідь на запитання. Він запитує, як реалізувати таку функцію, як MonthName (1).
amuliar

8

Ви можете використовувати вбудовану CONVERTфункцію

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

Тут буде показано перші 3 символи місяця (JAN, FEB тощо).


7

крім оригіналу

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


6

Використовуйте це твердження, щоб перетворити числове значення місяця в ім'я місяця.

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

Якщо я не помиляюся, це не використання цілого числа, як запитував ОП.
впливовий

5

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

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

1
Чи є функція перетворення дати в єврейську дату в SQL? Не те, що я знаю про ...
Hila DG

функція перетворення на єврейську дату: 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

Просто відніміть поточний місяць від сьогоднішньої дати, а потім додайте свій номер місяця. Потім скористайтеся функцією імені дати, щоб вказати повне ім'я в усіх рядках.

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 )

Пояснення:

  1. Перша змінна декальре 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) як місяць FROM table_name


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

ВИБІР МІСЬКОГО МІСЯЦЯ (concat ('1970 -', [Місяць int val], '- 01'))

Приклад - ВИБІР МІСЯЦЯ (konkat ('1970 -', 4, '- 01'))

відповідь- квітень

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.