2

月と年のフィールドのみをintとして含むテーブルがあります。入力が与えられた場合、月、6か月と言います。6か月前のデータを投影する必要があります。

たとえば、2001年の第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())

たとえば、 2つの列を連結して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

キャストなし。

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 に答える
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 に答える