在 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)
我有 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)