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

时间:2011-11-29 16:36:42

标签: sql-server

在T-SQL中,将月份名称转换为数字的最佳方法是什么?

E.g:

'January' -> 1
'February' -> 2
'March' -> 3

是否有可以执行此操作的内置函数?

13 个答案:

答案 0 :(得分:29)

这个怎么样?

select DATEPART(MM,'january 01 2011') -- returns 1
select DATEPART(MM,'march 01 2011')  -- returns 3
select DATEPART(MM,'august 01 2011') -- returns 8

答案 1 :(得分:14)

这个怎么样:

SELECT MONTH('March' + ' 1 2014') 

会返回3

答案 2 :(得分:3)

您可以创建一个函数,然后在select语句中引用它。 该功能可能与此类似:

if OBJECT_ID('fn_month_name_to_number', 'IF') is not null
drop function fn_month_name_to_number
go
create function fn_month_name_to_number (@monthname varchar(25))
returns int as
begin
declare @monthno as int;
select @monthno =
case @monthname
when 'January' then 1
when 'February' then 2
when 'March' then 3
when 'April' then 4
when 'May' then 5
when 'June' then 6
when 'July' then 7
when 'August' then 8
when 'September' then 9
when 'October' then 10
when 'November' then 11
when 'December' then 12
end
return @monthno
end

然后你可以查询它。

select fn_month_name_to_number ('February') as month_no

此查询将返回2作为月份编号。 您可以将列中的值作为参数传递给函数。

select fn_month_name_to_number (*columnname*) as month_no from *tablename*

祝你有个美好的一天!

答案 3 :(得分:3)

SELECT DATEPART(MM,'january '+'01 1900')
SELECT MONTH('january ' + '01 1900')
SELECT month(dateadd(month,DATEDIFF(month,0,'january 01 2015'),0))

答案 4 :(得分:2)

没有内置功能。<​​/ p>

您可以使用CASE声明:

CASE WHEN MonthName= 'January' THEN 1
     WHEN MonthName = 'February' THEN 2
     ...
     WHEN MonthName = 'December' TNEN 12
END AS MonthNumber 

或创建一个要加入的查找表

CREATE TABLE Months (
    MonthName VARCHAR(20),
    MonthNumber INT
);

INSERT INTO Months
    (MonthName, MonthNumber)
    SELECT 'January', 1
    UNION ALL
    SELECT 'February', 2
    UNION ALL
    ...
    SELECT 'December', 12;

SELECT t.MonthName, m.MonthNumber
    FROM YourTable t
        INNER JOIN Months m
            ON t.MonthName = m.MonthName;

答案 5 :(得分:1)

我最近有类似的经历(sql server 2012)。我没有控制输入的奢侈,我只是要求报告它。幸运的是,日期输入时带有3个字符的alpha月缩写,所以这使它变得简单&amp;快点:

TRY_CONVERT(DATETIME,REPLACE(obs.DateValueText,SUBSTRING(obs.DateValueText,1,3),CHARINDEX(SUBSTRING(obs.DateValueText,1,3),'...JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC')/4)) 

它工作了12个小时:
    2015年2月14日下午5:00:00 2015-02-14 17:00:00.000
和24小时:
    2013年9月27日22:45 2013-09-27 22:45:00.000

(谢谢ryanyuyu)

答案 6 :(得分:1)

我想您甚至可能有一个像monthdetails (Monthno int, monthnames char(15))这样的单独表格,并包含值:

1 January
2 February 

....依此类推,然后将此表与monthnames

中的现有表格结合使用
SELECT t1.*,t2.Monthno from table1 
left outer join monthdetails t2
on t1.monthname=t2.monthnames
order by t2.Monthno 

答案 7 :(得分:0)

如果您有日期(例如SubmittedDate)

,您可以这样做
DATENAME(MONTH,DATEADD(MONTH, MONTH(SubmittedDate) - 1, 0)) AS ColumnDisplayMonth

或者你可以这样做,如果你把月份作为int

DATENAME(MONTH,DATEADD(MONTH, @monthInt - 1, 0)) AS ColumnDisplayMonth

答案 8 :(得分:0)

您可以使用以下代码

DECLARE @T TABLE ([Month] VARCHAR(20))
INSERT INTO @T
SELECT 'January'
UNION
SELECT 'February'
UNION
SELECT 'March'`

SELECT MONTH('01-' + [Month] + '-2010') As MonthNumeric,[Month] FROM @T
ORDER BY MonthNumeric

答案 9 :(得分:0)

我知道这可能有点太晚了,但通过CTE这样做的最有效方法如下:

 WITH Months AS
    (
       SELECT 1 x
       UNION all
       SELECT x + 1
       FROM Months
       WHERE x < 12

     )
     SELECT x AS MonthNumber, DateName( month , DateAdd( month , x , -1 ))            AS MonthName FROM Months

答案 10 :(得分:0)

你可以试试这样,如果你有month_name是字符串datetype。转换后,你可以按月订购。

例如,您的表格如下:

 month
 Dec
 Jan
 Feb
 Nov
 Mar
  .
  .
  .

我的语法是:

 Month(cast(month+'1 2016' as datetime))

答案 11 :(得分:0)

它退出很简单, 取月份名称的前3位数字,然后使用此公式。

Select charindex('DEC','JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC')/4+1

答案 12 :(得分:-3)

select  Convert(datetime, '01 ' +  Replace('OCT-12', '-', ' '),6)