Converter número do mês em função de nome do mês no SQL

210

Tenho meses armazenados no SQL Server como 1,2,3,4, ... 12. Eu gostaria de exibi-los como janeiro, fevereiro etc. Existe uma função no SQL Server como MonthName (1) = janeiro? Estou tentando evitar uma instrução CASE, se possível.

Saif Khan
fonte

Respostas:

158

Um pouco hacky, mas deve funcionar:

SELECT DATENAME(month, DATEADD(month, @mydate-1, CAST('2008-01-01' AS datetime)))
Alexander Kojevnikov
fonte
2
Por que o '-1'? Isso é necessário porque os meses no SQL Server são compensados ​​por um?
Hassan Gulzar #
2
@ DoomerDGR8 é porque a data que está sendo usada para propagar a função dateadd começa em 1. Se precisarmos do nome de dados de janeiro, adicionaríamos 1 mês a 01-01-2008, o que nos daria 01-02-2008, que é Fevereiro. subtraímos 1 para explicar isso e recebemos janeiro novamente.
precisa saber é o seguinte
Para contornar o problema de subtrair 1 da data e hora, use uma data e um mês em dezembro, em vez de janeiro. Por exemplo, SELECT DATENAME (month, DATEADD (month, @mydate, CAST ('1978-12-01' AS datetime)))
Steve Matthews
3
Esta é uma boa informação, mas falha em responder à questão de como converter um número de mês em um nome de mês (em vez disso, responde como obter um nome de mês a partir de uma data). Você assumiu que ele tem o valor datetime em vez de apenas o número do mês; Para que isso funcione, você precisa "inventar" um valor de data / hora. Acho que a solução de leoinfo foi um pouco mais relevante
schizoid04
277

Eu acho que essa é a melhor maneira de obter o nome do mês quando você tiver o número do mês

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

Ou

Select DateName( month , DateAdd( month , @MonthNumber , -1 ) )
leoinfo
fonte
24
para fins de legibilidade, eu realmente escreveria assim: Selecione DateName (mês, DateAdd (mês, @MonthNumber - 1, '1900-01-01')) #
Valentino Vranken
10
Uma possível solução alternativa Select DATENAME (mês, DateAdd (mês, @MonthNumber, -1))
Asif
4
Perfeito. Essa deve ser a resposta.
gotqn
94
SELECT DATENAME(month, GETDATE()) AS 'Month Name'
Dharamvir
fonte
3
Está recebendo o nome do mês por data e não pelo número do mês, conforme solicitado.
Imad
72
SUBSTRING('JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC ', (@intMonth * 4) - 3, 3)
Darryl Martin
fonte
9
Eu gosto dessa maneira alternativa de pensar no campo esquerdo! Alimento para o pensamento
Michael Rodrigues
2
E é determinístico! Também pode ser usado como coluna computada, obrigado!
Irawan Soetomo
1
legal ... eu estava procurando por um código simples para obter meses de janeiro a [#] e isso funcionou muito bem. para a exibição de vários meses, apenas a mudança para algo como isto >> SUBSTRING ( 'Jan Fev Mar Abr Mai Jun Jul Ago Set Out Nov Dez', 0, (@intMonth * 4))
Pablo Contreras
2
Definitivamente, eu não pensaria nisso como o "caminho certo", mas é uma maneira divertida que pode ser usada para resolver outros problemas.
Paul
31

Use a melhor maneira

Select DateName( month , DateAdd( month , @MonthNumber , -1 ))
Até parece
fonte
21

É muito simples.

select DATENAME(month, getdate())

saída: janeiro

Saeed ur Rehman
fonte
4
Isso funciona apenas se você tiver um valor de data completo, não um número inteiro do mês.
gunr2171
2
Esta não é uma resposta para a pergunta. Ele está perguntando como implementar uma função como MonthName (1).
peculiar 30/03
8

Você pode usar a CONVERTfunção embutida

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

Isso exibirá os três primeiros caracteres do mês (JAN, FEB, etc.)

Marcus
fonte
7

além do original

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

você consegue fazer isso

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

Dessa forma, você obtém nomes para todas as linhas em uma tabela. onde [nome_da_coluna] representa uma coluna inteira contendo o valor numérico de 1 a 12

2 representa qualquer número inteiro; por sequência de contatos, criei uma data na qual posso extrair o mês. '/ 1/2011' pode ser qualquer data

se você quiser fazer isso com a variável

DECLARE @integer int;

SET @integer = 6;

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

fonte
7

O seguinte funciona para mim:

CAST(GETDATE() AS CHAR(3))
unitario
fonte
6

Use esta instrução para converter o valor numérico do mês em nome do mês.

SELECT CONVERT(CHAR(3), DATENAME(MONTH, GETDATE()))
Ashish Singh
fonte
A menos que eu esteja enganado, isso não está usando um número inteiro, como o OP pediu.
influente
5

Em alguns locais como o hebraico, há meses bissextos dependentes do ano. Para evitar erros nesses locais, considere a seguinte solução:

SELECT DATENAME(month, STR(YEAR(GETDATE()), 4) + REPLACE(STR(@month, 2), ' ', '0') + '01')     
Jim Burger
fonte
1
Existe uma função para converter uma data para uma data judaica no SQL? Não que eu saiba ...
Hila DG 20/10
função para converter para a data judaica: blogs.microsoft.co.il/gerireshef/2011/03/29/…
AJ AJ
5

Claro que isso vai funcionar

select datename(M,GETDATE())
Shyam Sa
fonte
5

A partir do SQL Server 2012, você pode usar FORMAT e DATEFROMPARTS para resolver esse problema. (Se você quiser nomes de meses de outras culturas, altere en-US:)

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

Se você deseja um mês de três letras:

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

Se você realmente deseja, pode criar uma função para isso:

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
Paulo
fonte
É isso que estou procurando. Obrigado pela solução.
Abdullah Al Mamun
Provavelmente não é o mais eficiente, mas é provavelmente o mais legível.
Paul
1
Ele até suporta localização! .. doce!
Rosdi Kasim
4

Você pode usar a função de conversão como abaixo

CONVERT(VARCHAR(3), DATENAME(MM, GETDATE()), 100)
Nori
fonte
4

Basta subtrair o mês atual da data de hoje e adicionar novamente o número do mês. Em seguida, use a função nomedodata para fornecer o nome completo em uma linha.

print datename(month,dateadd(month,-month(getdate()) + 9,getdate()))
Geoffrey Fuller
fonte
3

Eu acho que isso é suficiente para obter o nome do mês quando você tem data.

SELECT DATENAME(month ,GETDATE())
Benazir
fonte
3
SELECT DateName(M, DateAdd(M, @MONTHNUMBER, -1))
Isaías
fonte
3

Para converter o número do mês em nome do mês, tente o seguinte

declare @month smallint = 1
select DateName(mm,DATEADD(mm,@month - 1,0))
M2012
fonte
3
SELECT DATENAME(MONTH,dateadd(month, -3,getdate()))
gvila
fonte
1

Este funcionou para mim:

@MetricMonthNumber (some number)

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

De um post acima de @leoinfo e @Valentino Vranken. Apenas fiz uma seleção rápida e funciona.

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

Explicação:

  1. Variável do primeiro decalque MonthNumber
  2. Obter mês atual para o DatePartqual o número do mês de retorno
  3. Nome do mês de retorno da terceira consulta
Wafa Abbas
fonte
1
select monthname(curdate());

OU

select monthname('2013-12-12');
Piyush
fonte
1

Trabalhando para mim

SELECT MONTHNAME(<fieldname>) AS "Month Name" FROM <tablename> WHERE <condition>
Kashif Aslam
fonte
1

você pode obter a data assim. por exemplo: - Tabela de usuários

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

você pode obter o mês como este

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

resultado

+-----------+-------------------------------+
| year(created_at) | monthname(created_at)  |
+-----------+-------------------------------+
|      2017        | september              |
|      2017        | june                   |
Janaka Pushpakumara
fonte
Você pode encontrar documentação aqui. w3resource.com/mysql/date-and-time-functions/...
Janaka Pushpakumara
o OP solicitou o sql-server e não o mysql.
tavalendo
0

Use esta declaração para obter o nome do mês:

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

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

Isso fornecerá o nome abreviado do mês. Assim: jan, fev, mar, etc.

user4972370
fonte
0

Aqui está minha solução usando algumas informações de outras pessoas para resolver um problema.

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

Não há função definida pelo sistema no SQL server. Mas você pode criar sua própria função definida pelo usuário - uma função escalar. Você encontrará funções escalares no Pesquisador de Objetos para o seu banco de dados: Programabilidade-> Funções-> Funções com valor escalar. Abaixo, eu uso uma variável de tabela para reunir tudo.

--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]
Charlie Brown
fonte
0

Você pode criar uma função como esta para gerar o mês e selecionar dbo.fn_GetMonthFromDate (date_column) como Month FROM nome_da_tabela


/****** 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
Seth Winters
fonte
0

A maneira mais fácil é chamar a função MONTHNAME(your_date). sua_data pode ser um valor estático ou o valor de um dos campos da sua tabela.

Armand Mamitiana Rakotoarisoa
fonte
0

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

exemplo- SELECT MONTHNAME (concat ('1970 -', 4, '- 01'))

resposta- abril

Atanu Samanta
fonte