在 Sql-服务器中按月份名称排序

Order By Month Name in Sql-Server

我有 Below Table 命名会话

SessionID   SessionName

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

我执行了以下查询,得到了如下输出。

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

结果按会话 ID 排序。但我需要如下输出,

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

如何在sql服务器中实现这个?感谢帮助

我会使用 case 表达式,例如:

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

8 月有 1,因为“在应用程序逻辑中会话从 8 月开始”,如果您想从 1 月开始到 12 月结束,很容易重新编号。

我想你可以这样做:

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

部分:

MONTH(session.SessionName + ' 1 2014')

请问 return 这个月的 3 号是三月,在这种情况下你真的不需要关心年份

尝试CAST将您的月份名称 (SessionName) 转换为 DATETIME 格式,就像这样

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

为了避免与文化相关的任何麻烦,您可以使用如下查询从 sys 语言中获取月份的索引:

(我最终会以此创建一个 TVF 并将 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)

结果

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

编辑:直接使用的 UDF(例如在 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)

试试这个 .. 我假设你希望当前日期的下个月是起点所以我在脚本中使用 "Month(GetDate()" 否则你可以硬编码到 4 以获得所需的结果

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      

对于德语..使用下面的脚本..在这里我使用soundex进行月份比较

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    

您可以将字符串月份转换为数字,并按月份形式按数字排序

SELECT SessionID, SessionName, DATEPART(MM, SessionName)
FROM dbo.Session
ORDER BY DATEPART(MM, SessionName)

否则,如果您有类似“DateCreation”的列,您可以这样做

SELECT SessionID, SessionName, MONTH(DateCreation)
FROM dbo.Session
ORDER BY MONTH(DateCreation)