Convierta el nombre del mes en número de mes en SQL Server

En T-SQL, ¿cuál es la mejor manera de convertir un nombre de mes en un número?

P.ej:

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

Etc.

¿Hay alguna función incorporada que pueda hacer esto?

¿Qué tal esto?

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

Qué tal esto:

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

Volvería 3 .

Puede crear una función y luego consultarla en la statement de selección. La función puede ser similar a esto:

 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 

Entonces puedes consultarlo.

 select fn_month_name_to_number ('February') as month_no 

Esta consulta devolverá 2 como número de mes. Puede pasar valores de una columna como parámetros a la función.

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

¡Tenga un buen día!

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

No hay una función incorporada para esto.

Podría usar una statement CASE:

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

o crea una tabla de búsqueda para unirte contra

 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; 

Recientemente tuve una experiencia similar (servidor sql 2012). No tuve el lujo de controlar la entrada, solo tenía el requisito de informar sobre ella. Afortunadamente, las fechas se ingresaron con las principales abreviaturas alfa de 3 caracteres, por lo que esto lo hizo simple y rápido:

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

Funcionó durante 12 horas:
Feb-14-2015 5:00:00 PM 2015-02-14 17: 00: 00,000
y 24 horas:
27-sep-20-2013 22:45 2013-09-27 22: 45: 00,000

(gracias ryanyuyu)

Creo que incluso puede tener una tabla separada como un monthdetails (Monthno int, monthnames char(15)) e incluir valores:

 1 January 2 February 

…. y así sucesivamente, y luego únete a esta tabla con tu tabla existente en la columna de monthnames

 SELECT t1.*,t2.Monthno from table1 left outer join monthdetails t2 on t1.monthname=t2.monthnames order by t2.Monthno 

Puedes hacerlo de esta manera, si tienes la fecha (p. Ej., Fecha de envío)

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

O puede hacerlo de esta manera, si tiene el mes como int

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

Puedes usar el código a continuación

 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 

Sé que esto puede ser un poco tarde, pero la forma más eficiente de hacerlo es a través de un CTE de la siguiente manera:

  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 

Puede probar algo así, si tiene month_name que es string datetype. Después de la conversión, puede solicitar el pedido por mes.

Por ejemplo, su tabla como esta:

  month Dec Jan Feb Nov Mar . . . 

Mi syntax es:

  Month(cast(month+'1 2016' as datetime)) 
 select Convert(datetime, '01 ' + Replace('OCT-12', '-', ' '),6)