Ordre par nom de mois dans Sql-Server

J'ai sous la table nommée session

SessionID SessionName 100 August 101 September 102 October 103 November 104 December 105 January 106 May 107 June 108 July 

J'ai exécuté la requête suivante j'ai obtenu la sortie comme ci-dessous.

 Select SessionID, SessionName From dbo.Session SessionID SessionName 100 August 101 September 102 October 103 November 104 December 105 January 106 May 107 June 108 July 

les résultats sont classés par ID de session. Mais j'ai besoin de la sortie comme ci-dessous,

 SessionID SessionName 106 May 107 June 108 July 100 August 101 September 102 October 103 November 104 December 105 January 

Comment réaliser ceci dans sql-server? Merci pour l'aide

J'utiliserais une expression de case , comme:

 order by case SessionName when 'August' then 1 when 'September' then 2 ... when 'Juty' then 12 end 

Août a 1 parce que " dans la logique de l'application une session a commencé avec août ", facile à renuméroter si vous voulez commencer avec Janvier et terminer avec Décembre.

Pour éviter tout hassel avec des dependencies de culture, vous pouvez get l'index du mois à partir de langues sys avec une requête comme celle-ci:

(Je finirais par créer un TVF à partir de ceci et passerais dans le paramètre langid )

 SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) MyMonthIndex ,Mnth.value('.','varchar(100)') AS MyMonthName FROM ( SELECT CAST('<x>' + REPLACE(months,',','</x><x>') + '</x>' AS XML) AS XmlData FROM sys.syslanguages WHERE langid=0 ) AS DataSource CROSS APPLY DataSource.XmlData.nodes('/x') AS The(Mnth) 

Le résultat

 1 January 2 February 3 March 4 April 5 May 6 June 7 July 8 August 9 September 10 October 11 November 12 December 

EDIT: Un UDF pour une utilisation directe (par exemple dans une order by )

 CREATE FUNCTION dbo.GetMonthIndexFromMonthName(@MonthName VARCHAR(100),@langId INT) RETURNS INT AS BEGIN RETURN ( SELECT MyMonthIndex FROM ( SELECT CAST(ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS INT) MyMonthIndex ,Mnth.value('.','varchar(100)') AS MyMonthName FROM ( SELECT CAST('<x>' + REPLACE(months,',','</x><x>') + '</x>' AS XML) AS XmlData FROM sys.syslanguages WHERE langid=@langId ) AS DataSource CROSS APPLY DataSource.XmlData.nodes('/x') AS The(Mnth) ) AS tbl WHERE MyMonthName=@MonthName ); END GO SELECT dbo.GetMonthIndexFromMonthName('February',0) 

Je pense que vous pouvez faire quelque chose comme ça:

 SELECT * FROM session ORDER BY MONTH(session.SessionName + ' 1 2014') 

La partie:

 MONTH(session.SessionName + ' 1 2014') 

Le return du mois 3 est mars et vous n'avez pas vraiment besoin de vous soucier de l'année dans ce cas

Essayez CAST votre nom de mois (SessionName) au format DATETIME , comme ceci

 SELECT * FROM table ORDER BY DATEPART(mm, CAST(SessionName + '1900' AS DATETIME)) asc 

Essayez avec ceci .. Je suppose que vous voulez le mois prochain de date courante est le sharepoint départ donc j'utilise "Month (GetDate ()" dans le script sinon vous pouvez dur-code à 4 pour get le résultat souhaité

 Declare @Session Table (SessionID INT, SessionName Varchar(20)) Insert Into @Session Values (100,'August'),(101,'September'),(102,'October'),(103,'November'),(104,'December') ,(105,'January'),(106,'May'),(107,'June'),(108,'July') Select * From @Session ORDER BY CASE WHEN Month(CAST('01-' + SessionName + ' 2016' AS DateTime)) - Month(GetDate()) <= 0 THEN 12 + Month(CAST('01-' + SessionName + ' 2016' AS DateTime)) - Month(GetDate()) ELSE Month(CAST('01-' + SessionName + ' 2016' AS DateTime)) - Month(GetDate()) END 

Pour la langue allemande ..utilisez ci-dessous script .. Dans ce j'ai utilisé soundex pour la comparaison de mois

 SET LANGUAGE GERMAN; Declare @Session Table (SessionID INT, SessionName Varchar(20)) Insert Into @Session Values (100,'August'),(101,'September'),(102,'October'),(103,'November'),(104,'December') ,(105,'January'),(106,'May'),(107,'June'),(108,'July') Select * From @Session S INNER JOIN (SELECT Number + 1 as [MonthNumber], DateName(mm,DATEADD(mm,Number,0)) as [MonthName] FROM master..spt_values WHERE Type = 'P' and Number < 12 )M ON SoundEx(M.MonthName)=SoundEx(S.SessionName) ORDER BY CASE WHEN [MonthNumber] - Month(GetDate()) <= 0 THEN 12 + [MonthNumber] - Month(GetDate()) ELSE [MonthNumber] - Month(GetDate()) END