如何根据sql中的Condition获取动态月份数据

时间:2014-06-03 06:27:56

标签: sql sql-server sql-server-2008

我正在从事金融领域工作。 所以我想要4月到5月的数据。

假设本月是6月,那么我只想要今年4月到6月,它应按年和月分组。

如果假设当月是2月那么我想要去年4月到1月的详情 即2013年4月至2014年1月

我已经为此写了CTE表达式我得到了部分结果我不知道我做错了或者说错了

declare @Month int 
declare @Year int ;
set @Month = 4;
set @Year = YEAR(GETDATE());

if (@Month <= MONTH(GETDATE()))
    with cte as 
    (
    SELECT N = 4, YYY =  YEAR(GETDATE())
    UNION ALL
    SELECT N + 1, YYY
    FROM cte
    WHERE N+1 <= MONTH(GETDATE())
    )
    select N, YYY from cte

else  

    with cte as 
    (

    SELECT N = 4 , YYYY = YEAR(GETDATE() - 1)
    UNION ALL
    SELECT N + 1,YYYY
    FROM cte
    WHERE N+1 <= 12     
    )
    select N, YYYY from cte

我想要O / P这样的东西

如果当前月份大于4月那么或更具体地假设当前月份是6月份 那么

April 2014
May   2014
June  2014

如果当前月份是2014年2月,那么我想要

April 2013
May   2013
June  2013
July  2013   
Aug   2013 
Sep   2013
Oct   2013
Nov   2013
Dec   2013
Jan   2014
Feb   2014

谢谢。

1 个答案:

答案 0 :(得分:3)

DECLARE @CurrentDate AS datetime = '20150212';
DECLARE @FirstDayInCurrentMonth AS datetime = DATEADD(day, 1 - DATEPART(day, @CurrentDate), @CurrentDate);
DECLARE @LastApril AS datetime = DATEADD(month, -(DATEPART(month, @FirstDayInCurrentMonth) + 8) % 12, @FirstDayInCurrentMonth);

WITH Periods AS (
    SELECT @LastApril AS [Period]
  UNION ALL
    SELECT DATEADD(month, 1, [Period])
    FROM Periods
    WHERE [Period] < @FirstDayInCurrentMonth
)
SELECT DATENAME(month, [Period])
      ,DATEPART(year, [Period])
FROM Periods

请注意,这只会在4月返回4月。从您的问题来看,您是否想要在4月份过1或13个月的日子并不清楚。