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


Немного хакерский, но должен работать:
SELECT DATENAME(month, DATEADD(month, @mydate-1, CAST('2008-01-01' AS datetime)))
@ DoomerDGR8 это на самом деле потому, что дата, которая используется для заполнения функции dateadd, начинается с 1. если нам нужно имя даты января, мы бы добавили 1 месяц к 2008-01-01, что дало бы нам 2008-02-01, то есть Февраль. поэтому мы вычитаем 1, чтобы учесть это, и снова получаем январь.
Чтобы обойти проблему вычитания 1 из даты и времени, используйте дату и время в декабре, а не в январе. Например, ВЫБЕРИТЕ ИМЯ ДАТЫ (месяц, ДОБАВИТЬ ДАТУ (месяц, @mydate, CAST ('1978-12-01' AS datetime)))
Это хорошая информация, но она не отвечает на вопрос о том, как преобразовать номер месяца в название месяца (скорее отвечает, как получить название месяца из даты). Вы предположили, что он имеет значение datetime, а не просто номер месяца; чтобы заставить это работать, вам теперь нужно «изобрести» значение даты / времени. Думаю, решение от leoinfo было немного более актуальным
В некоторых регионах, таких как иврит, високосные месяцы зависит от года, поэтому, чтобы избежать ошибок в таких регионах, вы можете рассмотреть следующее решение:
SELECT DATENAME(month, STR(YEAR(GETDATE()), 4) + REPLACE(STR(@month, 2), ' ', '0') + '01')
Есть ли функция для преобразования даты в еврейскую дату в SQL? Не то, что я знаю о...
функция для преобразования в еврейскую дату: blogs.microsoft.co.il/gerireshef/2011/03/29/…
Я думаю, что это лучший способ получить название месяца, когда у вас есть номер месяца
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'))
одно возможное альтернативное решение Select DateName (month, DateAdd (month, @MonthNumber, -1))
Это идеально. Это должен быть ответ.
Вы можете использовать встроенную функцию CONVERT
select CONVERT(varchar(3), Date, 100) as Month from MyTable.
Это отобразит первые 3 символа месяца (ЯНВАРЬ, ФЕВРАЛЬ и т. д.)
SELECT DATENAME(month, GETDATE()) AS 'Month Name'
Он получает название месяца по дате, а не по номеру месяца, как просил SO.
Вы можете использовать функцию преобразования, как показано ниже
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.
SUBSTRING('JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC ', (@intMonth * 4) - 3, 3)
Мне нравится этот очень левый альтернативный образ мышления! Пища для размышлений
И это детерминировано! Может также использоваться как вычисляемый столбец, спасибо!
хорошо ... я искал какой-то простой код, чтобы получить месяцы с января до [#], и это отлично сработало. для отображения нескольких месяцев просто измените на что-то вроде этого >> SUBSTRING ('ЯНВАРЬ ФЕВРАЛЬ МАРТ МАЙ ИЮНЬ ИЮЛЬ АВГУСТ СЕНТЯБРЬ ОКТЯБРЬ ДЕК', 0, (@intMonth * 4))
Я определенно не считаю это «правильным», но это интересный способ, который можно использовать для решения других проблем.
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.
Declare @MonthNumber int
SET @MonthNumber=DatePart(Month,GETDATE())
Select DateName( month , DateAdd( month , @MonthNumber , 0 ) - 1 )
Объяснение:
MonthNumberDatePart, который возвращает номер месяцаЯ думаю, что этого достаточно, чтобы получить название месяца, когда у вас есть дата.
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()))
Если я не ошибаюсь, это не целое число, как просил ОП.
Используйте этот оператор для получения названия месяца:
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())
выход: январь
Это работает, только если у вас есть полное значение даты, а не целое число месяца.
Это не ответ на вопрос. Он спрашивает, как реализовать такую функцию, как MonthName (1).
Чтобы преобразовать номер месяца в название месяца, попробуйте следующее
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/…
OP запросил sql-server, а не mysql.
Начиная с 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
Это то, что я ищу. Спасибо за решение.
Вероятно, он не самый эффективный, но, вероятно, самый легко читаемый.
Даже локализацию поддерживает! .. сладко!
Вы можете создать такую функцию, чтобы генерировать Месяц и делать ВЫБЕРИТЕ 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'))
Ответ - апрель
Почему «-1»? Это необходимо, потому что месяцы в SQL Server смещены на единицу?