SQL中的移动月存储过程查询

SQL中的移动月存储过程查询,sql,sql-server,stored-procedures,sql-server-2012,sql-order-by,Sql,Sql Server,Stored Procedures,Sql Server 2012,Sql Order By,我正在创建一个具有移动月份概念的存储过程。其思想是,当前月份应具有最高优先级,其次是上个月,然后是前一个月。如何编写以这种方式自动排序的查询 给出了12个月的固定期限。月份列可以假定为int或3个字母的字符串 例如,这个月是Jul,顺序应该是Jul、Jun、May、Apr、Mar、Feb、Jan、Dec、Nov、Oct、Sep、Aug尝试此自定义排序 SELECT Datename(month, Cast(mon + '1900' AS DATE)) AS [Month] FROM (VAL

我正在创建一个具有移动月份概念的存储过程。其思想是,当前月份应具有最高优先级,其次是上个月,然后是前一个月。如何编写以这种方式自动排序的查询

给出了12个月的固定期限。月份列可以假定为int或3个字母的字符串


例如,这个月是
Jul
,顺序应该是
Jul、Jun、May、Apr、Mar、Feb、Jan、Dec、Nov、Oct、Sep、Aug

尝试此
自定义排序

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 
如果您只想在结果中输入
月份的前三个字母
,请使用

选择左侧(日期名称(月份,演员阵容(周一+1900年为日期)),3)作为[月份]


    • 以下是另一种方式。它基于使用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中加入此表。

      试试这个

      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) 选择左侧(DATENAME(MONTH,DATEADD(MONTH,ISNULL(NULLIF((MONTH(GETDATE())+MONTHNUM)%12,0),12)-1,0)),3) 从(12)、(11)、(10)、(9)、(8)、(7)、(6)、(5)、(4)、(3)、(2)、(1))A(月)
      你可以试试这样的

      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
      

      存储您需要排序的月份信息的列的数据类型是什么。您使用的是哪种DBMS?您好,月份可以是int,例如Jan=1、Feb=2,也可以是3个字母的字符串。更新了我的标签,谢谢!您是否可以共享您的select查询,以便更轻松地帮助您了解order by。谢谢。