2011-11-29 140 views

回答

26

这个怎么样?

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

这里没有内置函数。

你可以使用一个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; 
+0

@ MarkStorey史密斯:每月函数采用日期时间或日期类型输入,而不是OP在其问题中指定的具有月份名称的字符串。 –

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

这个问题已经正确回答了几个upvotes,最重要的是,这个答案是错误的,这个查询的结果是'2012-10-01 00:00:00.000',与问题无关 – Yaroslav

0

你可以这样做,如果你有日期(例如,提交日期)

DATENAME(MONTH,DATEADD(MONTH, MONTH(SubmittedDate) - 1, 0)) AS ColumnDisplayMonth 

或者你可以做我这样,如果你有一个月作为int

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

你可以创建一个函数,然后在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* 

祝您有美好的一天!

+1

还有我们可以从内布拉斯加州到阿拉斯加的许多路径。我选择加拿大,你的巴拿马... – Christian

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 
11

如何:

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

将返回3

+0

不知道哪一个更好 – Faiz

+0

为他人,请注意,'1 2004'只是一个虚拟的日期和年份,可以是任何东西,最好是一些旧的日期。 –

1

我最近有一个类似的经验(SQL Server 2012)。我没有控制投入的奢侈,我只是有一个要求报告的要求。幸运的是,日期分别与领先的3字符字母缩写月份进入,所以这使得它简单&快速:

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时:
二月-14-2015下午5时00分零零秒2015 - 02-14 17:00:00.000
和24小时时间:
2013年9月27日22:45 2013-09-27 22:45:00。000

(感谢ryanyuyu)

+0

格式化您的SQL将使您的答案实际可读。我建议在另一个文本编辑器中对其进行格式化,然后在此处粘贴格式化的代码(并在需要时单击格式代码按钮)。 – ryanyuyu

+0

帮助我,因为3个字符的alpha月份缩写。谢谢! – SQLHound

3
SELECT DATEPART(MM,'january '+'01 1900') 
SELECT MONTH('january ' + '01 1900') 
SELECT month(dateadd(month,DATEDIFF(month,0,'january 01 2015'),0)) 
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 
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 
0

你可以尝试这样的某物,如果你有MONTH_NAME这串datetype.After转换,您可以随时按月订购。

例如,你的表是这样的:

month 
Dec 
Jan 
Feb 
Nov 
Mar 
    . 
    . 
    . 

我的语法是:

Month(cast(month+'1 2016' as datetime)) 
相关问题