回答:
次の例では、現在の日付に-1年が加算されます。
SELECT ... From ... WHERE date > DATEADD(year,-1,GETDATE())
前の暦年の結果を選択するのに役立つ解決策を探しているときに、このページを見つけました。上記の結果のほとんどは、過去365日間のアイテムを返しているようですが、私にはうまくいきませんでした。
同時に、次のコードで私のニーズを解決するのに十分な方向性が与えられました-私と同じニーズを持ち、解決策を探す際にこのページに出くわす可能性がある他の人のためにここに投稿します。
SELECT .... FROM .... WHERE year(*your date column*) = year(DATEADD(year,-1,getdate()))
上記のおかげで私が必要なものにたどり着くことができました。
まあ、私はここで何かが欠けていると思います。ユーザーは、過去365日間ではなく、昨年のデータを取得したいと考えています。大きな違いがあります。私の意見では、昨年のデータは2007年のすべてのデータです(現在2008年にいる場合)。したがって、正しい答えは次のとおりです。
SELECT ... FROM ... WHERE YEAR(DATE) = YEAR(GETDATE()) - 1
次に、このクエリを制限する場合は、他のフィルターを追加できますが、常に昨年を検索します。
SELECT ... FROM ... WHERE YEAR(DATE) = YEAR(GETDATE()) - 1 AND DATE > '05/05/2007'
最も読みやすいIMO:
SELECT * FROM TABLE WHERE Date >
DATEADD(yy, -1, CONVERT(datetime, CONVERT(varchar, GETDATE(), 101)))
どれ:
DATEDIFFとDATEADDには、今日の真夜中を取得するバリアントがありますが、どちらかと言えば鈍い傾向があります(データのフェッチに必要な読み取りと比較すると、パフォーマンスはやや優れています-気が付かないでしょう)。
GETDATE()は現在の日付と時刻を返します。
昨年が昨年の当日の午前0時に始まる場合(元の例のように)、次のようなものを使用する必要があります。
DECLARE @start datetime
SET @start = dbo.getdatewithouttime(DATEADD(year, -1, GETDATE())) -- cut time (hours, minutes, ect.) -- getdatewithouttime() function doesn't exist in MS SQL -- you have to write one
SELECT column1, column2, ..., columnN FROM table WHERE date >= @start
「SQLのみ」を使用している場合は、他の提案が適しています。
ただし、可能であれば、プログラムで日付を計算し、SQLクエリに文字列として挿入することをお勧めします。
少なくとも大きなテーブル(つまり、数百万行、場合によっては結合と組み合わせる)の場合、オプティマイザがより適切に機能できるため、速度が大幅に向上します。
declare @iMonth int
declare @sYear varchar(4)
declare @sMonth varchar(2)
set @iMonth = 0
while @iMonth > -12
begin
set @sYear = year(DATEADD(month,@iMonth,GETDATE()))
set @sMonth = right('0'+cast(month(DATEADD(month,@iMonth,GETDATE())) as varchar(2)),2)
select @sYear + @sMonth
set @iMonth = @iMonth - 1
end