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

Sql server 在SQL Server中将月份名称转换为月份编号,sql-server,Sql Server,在T-SQL中,将月份名称转换为数字的最佳方法是什么 例如: 等等 是否有任何内置函数可以做到这一点?这个如何 select DATEPART(MM,'january 01 2011') -- returns 1 select DATEPART(MM,'march 01 2011') -- returns 3 select DATEPART(MM,'august 01 2011') -- returns 8 没有用于此的内置函数 您可以使用案例陈述: CASE WHEN MonthName=

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

例如:

等等

是否有任何内置函数可以做到这一点?

这个如何

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

没有用于此的内置函数

您可以使用案例陈述:

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;

如果您有日期,例如SubmittedDate,您可以这样做

DATENAME(MONTH,DATEADD(MONTH, MONTH(SubmittedDate) - 1, 0)) AS ColumnDisplayMonth
或者你也可以这样做,如果你把月份作为整数

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

您可以创建一个函数,然后在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*
祝你有愉快的一天

您可以使用以下代码

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
这个怎么样:

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

将返回3

我最近也有过类似的sql server 2012体验。我没有控制输入的奢侈,我只是有一个报告它的要求。幸运的是,日期是用前导的3个字符的alpha-month缩写输入的,因此它简单快捷:

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年2月14日17:00:00.000 和24小时时间: 2013年9月27日22:45 2013年9月27日22:45:00.000


谢谢ryanyuyu

我认为您甚至可能有一个单独的表,如monthdetails Monthno int,monthnames char15,并包括以下值:

SELECT DATEPART(MM,'january '+'01 1900')
SELECT MONTH('january ' + '01 1900')
SELECT month(dateadd(month,DATEDIFF(month,0,'january 01 2015'),0))
1 January
2 February 
。。。。依此类推,然后将此表与monthnames列中的现有表联接


我知道这可能有点晚了,但通过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

如果你有一个月的名字,它是字符串日期类型,你可以试着这样做。转换后,你可以随意按月订购

例如,您的表格如下所示:

 month
 Dec
 Jan
 Feb
 Nov
 Mar
  .
  .
  .
我的语法是:

 Month(cast(month+'1 2016' as datetime))
很简单,, 取月份名称的前3位数字并使用此公式

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

如果您扩大您的问题和要求,这将有助于我们bit@MarkStorey-Smith:MONTH函数接受datetime或date类型的输入,而不是OP在问题中指定的带有月份名称的字符串。这个问题已经通过多次向上投票正确回答了,除此之外,这个答案是错误的,这个查询的结果是2012-10-01 00:00:00.000,与这个问题无关我们可以从内布拉斯加州到阿拉斯加走很多路。我选择加拿大,你选择巴拿马…不确定哪一个对其他人来说性能更好,请注意,“2004年1月”只是一个虚拟日期和年份,可以是任何日期,最好是一些旧日期。我在670000行上测试了DATEPART和MONTH的类似性能。格式化SQL将使您的答案实际可读。我建议在另一个文本编辑器中格式化它,然后将格式化代码粘贴到这里,如果需要,单击“格式化代码”按钮。这对我很有帮助,因为3个字符的alpha-month缩写。谢谢
 month
 Dec
 Jan
 Feb
 Nov
 Mar
  .
  .
  .
 Month(cast(month+'1 2016' as datetime))
Select charindex('DEC','JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC')/4+1