在SQL中将月号转换为月份名称函数

Sai*_*han 201 sql t-sql sql-server sql-server-2005

我有几个月在SQL Server中存储为1,2,3,4,... 12.我想将它们显示为1月,2月等.在SQL Server中是否有像MonthName(1)= January这样的函数?如果可能的话,我试图避免CASE声明.

leo*_*nfo 259

我认为这是得到的最好方式月份的名字时,你有一个月数

Select DateName( month , DateAdd( month , @MonthNumber , 0 ) - 1 )
Run Code Online (Sandbox Code Playgroud)

要么

Select DateName( month , DateAdd( month , @MonthNumber , -1 ) )
Run Code Online (Sandbox Code Playgroud)

  • 为了便于阅读,我实际上会这样写:选择DateName(月,DateAdd(月,@ MononNumber - 1,'1900-01-01')) (24认同)
  • 一种可能的替代解决方案选择DateName(月,DateAdd(月,@ MonthNumber,-1)) (10认同)
  • 那很完美.这应该是答案. (4认同)

Ale*_*kov 152

有点hacky但应该工作:

SELECT DATENAME(month, DATEADD(month, @mydate-1, CAST('2008-01-01' AS datetime)))
Run Code Online (Sandbox Code Playgroud)

  • 这是一条很好的信息,但实际上并未回答如何将月份数字转换为月份名称的问题(而是回答了如何从日期获取月份名称的问题)。您已经假设他具有datetime值,而不仅仅是月份号;为了使它起作用,您现在需要“发明”日期/时间值。认为leoinfo的解决方案更有意义 (3认同)
  • 为什么'-1'?这是否需要,因为SQL Server中的月份被一个偏移? (2认同)
  • @ DoomerDGR8它实际上是因为用于播种dateadd函数的日期从1开始.如果我们需要1月的日期名称,我们将在2008-01-01中添加1个月,这将给我们2008-02-01,这是二月.所以我们减去1来解释这一点,然后我们再次获得1月份. (2认同)

小智 90

SELECT DATENAME(month, GETDATE()) AS 'Month Name'
Run Code Online (Sandbox Code Playgroud)

  • 正如所问的那样,它是按日期而不是月份编号获取月份名称。 (3认同)

小智 68

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

  • 我喜欢这种非常左侧的替代方式!值得深思 (8认同)
  • 而且是确定性的!也可以用作计算列,谢谢! (3认同)
  • 我绝对不会认为这是“正确的方式”,但这是一种可以用来解决其他问题的有趣方式。 (2认同)

Asi*_*sif 30

使用最佳方式

Select DateName( month , DateAdd( month , @MonthNumber , -1 ))
Run Code Online (Sandbox Code Playgroud)


Sae*_*man 21

这很简单.

select DATENAME(month, getdate())
Run Code Online (Sandbox Code Playgroud)

输出:1月

  • 仅当您具有完整日期值而非月份整数时才有效. (3认同)
  • 这不是问题的答案。他在问如何实现像 MonthName(1) 这样的函数。 (2认同)

Pau*_*aul 7

从 SQL Server 2012 开始,可以使用FORMATDATEFROMPARTS来解决这个问题。(如果你想从其他文化月份名称,更改:en-US

select FORMAT(DATEFROMPARTS(1900, @month_num, 1), 'MMMM', 'en-US')
Run Code Online (Sandbox Code Playgroud)

如果你想要一个三个字母的月份:

select FORMAT(DATEFROMPARTS(1900, @month_num, 1), 'MMM', 'en-US')
Run Code Online (Sandbox Code Playgroud)

如果你真的想,你可以为此创建一个函数:

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
Run Code Online (Sandbox Code Playgroud)


Jim*_*ger 6

在某些语言环境(如希伯来语)中,闰月取决于年份,因此为避免此类语言环境中的错误,您可以考虑以下解决方案:

SELECT DATENAME(month, STR(YEAR(GETDATE()), 4) + REPLACE(STR(@month, 2), ' ', '0') + '01')     
Run Code Online (Sandbox Code Playgroud)


小智 6

您可以使用内置CONVERT功能

select CONVERT(varchar(3), Date, 100)  as Month from MyTable.
Run Code Online (Sandbox Code Playgroud)

这将显示月份的前3个字符(JAN,FEB等。)


小智 5

除了原创

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')
Run Code Online (Sandbox Code Playgroud)


uni*_*rio 5

以下适用于我:

CAST(GETDATE() AS CHAR(3))
Run Code Online (Sandbox Code Playgroud)


Ash*_*ngh 5

使用此语句将“月份”数值转换为“月份名称”。

SELECT CONVERT(CHAR(3), DATENAME(MONTH, GETDATE()))
Run Code Online (Sandbox Code Playgroud)


小智 5

只需从今天的日期中减去当前月份,然后加回您的月份数字即可。然后使用 datename 函数在 1 行中给出全名。

print datename(month,dateadd(month,-month(getdate()) + 9,getdate()))
Run Code Online (Sandbox Code Playgroud)