我正在创建一个具有移动月概念的存储过程。这个想法是当前月份应该具有最高优先级,然后是前一个月,然后是前一个月。如何编写以这种方式自动排序的查询?
给出了12个月的修复期。 Month列可以假定为int或3个字母的字符串。
例如,本月为Jul
,序列应为Jul, Jun, May, Apr, Mar, Feb, Jan, Dec, Nov, Oct, Sep, Aug
答案 0 :(得分:0)
试试这个custom sort
SELECT Datename(month, Cast(mon + '1900' AS DATE)) AS [Month]
FROM (VALUES ('Jul'),('Jun'),('May'),('Apr'),
('Mar'),('Feb'),('Jan'),('Dec'),
('Nov'),('Oct'),('Sep'),('Aug')) tc (mon)
ORDER BY CASE
WHEN Month(Cast(mon + '1900' AS DATE)) - Month(Getdate()) = 0 THEN -2
ELSE Sign(Month(Cast(mon + '1900' AS DATE)) - Month(Getdate()))
END,
Month(Cast(mon + '1900' AS DATE)) - Month(Getdate()) DESC
如果您只想在结果中使用month
的前三个字母,请使用
Select LEFT(Datename(month, Cast(mon + '1900' AS DATE)),3) as [Month]
答案 1 :(得分:0)
以下是另一种方式。它基于使用SYSOBJECTS作为方便的数字表,并使用今天的日期(即GETDATE())来导出当前日期。
SELECT TOP 12
SUBSTRING(DATENAME(MONTH, DATEADD(Month, -ROW_NUMBER() OVER (ORDER BY id) + 1, GETDATE())), 1, 3) AS MonthStr,
DATEADD(month, DATEDIFF(month, 0, DATEADD(Month, -ROW_NUMBER() OVER (ORDER BY id) + 1, GETDATE())), 0) AS FirstDayOfMonth
FROM
sysobjects
它为您提供了如下结果集:
MonthStr FirstDayOfMonth
-------- ---------------
Jul 2015-07-01 00:00:00.000
Jun 2015-06-01 00:00:00.000
May 2015-05-01 00:00:00.000
Apr 2015-04-01 00:00:00.000
Mar 2015-03-01 00:00:00.000
Feb 2015-02-01 00:00:00.000
Jan 2015-01-01 00:00:00.000
Dec 2014-12-01 00:00:00.000
Nov 2014-11-01 00:00:00.000
Oct 2014-10-01 00:00:00.000
Sep 2014-09-01 00:00:00.000
Aug 2014-08-01 00:00:00.000
将TOP 12
更改为任何其他值以展开或缩短发出的日期。您可以在SP中加入此表格。
答案 2 :(得分:0)
试试这个。
SELECT LEFT(DATENAME(MONTH,DATEADD(MONTH,ISNULL(NULLIF((MONTH(GETDATE()) + MONTHNUM)%12,0),12) -1,0)),3) FROM (VALUES(12),(11),(10),(9),(8),(7),(6),(5),(4),(3),(2),(1)) A (MONTHNUM)
答案 3 :(得分:0)
你可以尝试这样的事情。
SELECT MonthNumber
,LEFT(DATENAME(Month,DATEADD( MONTH , MonthNumber , 0 )-1),3) MonthName
FROM (VALUES(1),(2),(3),(4),(5),(6),
(7),(8),(9),(10),(11),(12)) mn(MonthNumber)
ORDER BY CASE WHEN MonthNumber > DATEPART(m,GETDATE())
THEN MonthNumber - 12
ELSE
MonthNumber
END DESC