在SQL中将月份编号转换为月份名称功能


210

我在SQL Server中以1、2、3、4,... 12的形式存储了几个月。我想将它们显示为一月,二月等。SQLServer中是否有像MonthName(1)= January这样的函数?如果可能,我试图避免使用CASE语句。

Answers:


158

有点hacky,但应该可以工作:

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

2
为什么是“ -1”?是否需要这样做,因为SQL Server中的月份被一个月抵消了?
哈桑·古尔扎

2
@ DoomerDGR8实际上是因为用来为dateadd函数设定种子的日期从1开始。如果我们需要一月的日期名称,我们将在2008-01-01上添加1个月,这将使我们获得2008-02-01,即二月。所以我们减去1来解决这个问题,然后又得到一月。
DForck42

要解决从日期时间中减去1的问题,请使用12月而不是1月的日期时间。例如SELECT DATENAME(month,DATEADD(month,@mydate,CAST('1978-12-01'AS datetime)))
Steve Matthews

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

10
一种可能的替代解决方案选择DateName(month,DateAdd(month,@MonthNumber,-1))
Asif

4
那很完美。这应该是答案。
gotqn

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

3
因此,它要求按日期而不是月份号获取月份名称。
Imad

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

9
我喜欢这种非常左领域的思考方式!
Michael Rodrigues

2
这是确定性的!也可以用作计算列,谢谢!
Irawan Soetomo

1
很好...我一直在寻找一些简单的代码来使jan到[#]都花几个月的时间,所以效果很好。为了显示几个月,只需将其更改为以下内容>> SUBSTRING('JAN FEB MAR APR MAY JUN AUL SEP OCT NOV DEC',0,(@intMonth * 4))
Pablo Contreras

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

这样,您将获得表中所有行的名称。其中[column_name]代表包含数值1到12的整数列

2代表任何整数,我通过联系字符串创建了一个可以提取月份的日期。“ / 1/2011”可以是任何日期

如果您想使用变量

DECLARE @integer int;

SET @integer = 6;

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

7

以下对我有用:

CAST(GETDATE() AS CHAR(3))




5

从SQL Server 2012开始,可以使用FORMATDATEFROMPARTS解决此问题。(如果你想从其他文化月份名称,更改: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

它可能不是最有效的,但可能是最易读的。
保罗

1
它甚至支持本地化!
Rosdi Kasim

4

您可以如下使用convert functin

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 )

说明:

  1. 第一个十进制变量 MonthNumber
  2. 获取DatePart返回月份号的当前月份
  3. 第三查询返回月份名称

1
select monthname(curdate());

要么

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


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                   |


OP要求使用sql-server而不是mysql。
tavalendo '18 -10-1

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 Server中没有系统定义的功能。但是您可以创建自己的用户定义函数-标量函数。您将在数据库的对象资源管理器中找到标量函数:可编程性->函数->标量值函数。在下面,我使用一个表变量将它们组合在一起。

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

您可以创建一个像这样的函数来生成Month并选择dbo.fn_GetMonthFromDate(date_column)作为Month 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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.