2

我有一个表,其中只包含月份和年份字段,两者都是 int。给定一个输入,比如月份,6 个月。我需要投影 6 个月大的数据。

例如,我有 2001 年 1 月 1 日至今的数据。给定输入为 6 个月,所以我必须从当前日期返回 6 个月才能得到结果。

输出将是 2001 年 1 月至 2012 年 1 月的数据。

我已经使用正确的子字符串字符串比较完成了程序。(一个讨厌的黑客)

有什么突出的方法吗?

DDL

Declare @t table (Mnth int, Yr int)
Insert Into @t 

-- 2011
Select 1,2011 Union All select 2,2011 Union All Select 3, 2011 Union ALL Select 4,2011 Union ALL
Select 5,2011 Union All select 6,2011 Union All Select 7, 2011 Union ALL Select 8,2011 Union ALL
Select 9,2011 Union All select 10,2011 Union All Select 11, 2011 Union ALL Select 12,2011 Union ALL

--2012
Select 1,2012 Union All select 2,2012 Union All Select 3, 2012 Union ALL Select 4,2012 Union ALL
Select 5,2012 Union All select 6,2012 Union All Select 7, 2012 Union ALL Select 8,2012 Union ALL
Select 9,2012 Union All select 10,2012 Union All Select 11, 2012 Union ALL Select 12,2012

Declare @inputMonth int = 6

我正在尝试不进行字符串转换

Select Mnth,Yr,YEAR(DATEADD(mm,-@inputMonth,getdate())),MONTH(DATEADD(mm,-@inputMonth,getdate()))
From @t
WHERE   YEAR(DATEADD(mm,-@inputMonth,getdate())) < Yr
AND MONTH(DATEADD(mm,-@inputMonth,getdate())) < Mnth

但它不工作

谢谢

4

4 回答 4

4

您始终可以转换为日期时间并进行比较。

就像是:

WHERE
    CONVERT(Datetime, 
        CONVERT(nvarchar(4), YearPart) + '-' + CONVERT(nvarchar(2), MonthPart) + '-01')
    ) > DATEADD(month, -6, GETUTCDATE())

例如,将您的两列连接到 yield CONVERT(Datetime, "2011-1-01")

正如对另一个问题的回答所指出的那样,如果您不想进行字符串转换,则必须添加以执行一系列DATEADDto 0,即1900-01-01.

WHERE
    DATEADD(month, MonthPart-1, DATEADD(year, YearPart-1900, 0))
    > DATEADD(month, -6, GETUTCDATE())
于 2012-07-30T12:19:16.070 回答
0

尝试这个..

DECLARE @CurrentMonth tinyint,@CurrentYear tinyint
SELECT @currentMonth=Datepart(mm,getdate())
SELECT @CurrentYear=Datepart(yy,getdate())

IF((@currentmonth-6)<0)
 begin
  SELECT month,year FROM @t WHERE year =(@CurrentYear-1) AND month >(@currentMonth+6) 
   UNION ALL
  SELECT month,year FROM @t WHERE year=@CurrentYear AND month <= @CurrentMonth 
 end
ELSE
 begin
  SELECT month,year from @t WHERE year=@CurrentYear AND month between @CurrentMonth-6
  AND @CurrentMonth+1
 end
于 2012-07-30T13:01:55.413 回答
0

无需铸造。

Select *
From your table
Where  (yr= @someYear and mt between @someMonth-6 and @someMonth) or
       (@someMonth <6 and yr =@someYear - 1 and mt >= 12-(6-@someMonth) )
于 2012-07-30T12:27:25.247 回答
0

意识到我没有考虑过,新的解决方案:

declare @m int 
set @m = 11

declare @startDate datetime
set @startDate =  dateadd(mm,-@m,getdate())
select yr,mnth
from t
where
DateAdd(day, 1, 
      DateAdd(month, mnth - 1, 
          DateAdd(Year,yr-1900, 0))) >@startDate 
and
DateAdd(day, 1, 
      DateAdd(month, mnth - 1, 
          DateAdd(Year,yr-1900, 0)))  < getDate()
于 2012-07-30T12:28:43.963 回答