首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在SQL中移动月份存储过程查询

在SQL中移动月份存储过程查询
EN

Stack Overflow用户
提问于 2015-07-20 12:43:35
回答 3查看 91关注 0票数 2

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

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

例如,本月为Jul,序列应为Jul, Jun, May, Apr, Mar, Feb, Jan, Dec, Nov, Oct, Sep, Aug

EN

回答 3

Stack Overflow用户

发布于 2015-07-20 13:07:44

尝试此custom sort

代码语言:javascript
运行
复制
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]

票数 0
EN

Stack Overflow用户

发布于 2015-07-20 13:43:51

下面是另一种方式。它基于使用SYSOBJECTS作为方便的数字表,并使用今天的日期(即GETDATE())来派生当前日期。

代码语言:javascript
运行
复制
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

它会给你一个类似如下的结果集:

代码语言:javascript
运行
复制
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中加入此表。

票数 0
EN

Stack Overflow用户

发布于 2015-07-20 22:45:40

你可以试试这样的东西。

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31508979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档