昨年のみのデータを取得する必要があるクエリを作成しています。これを行う最善の方法は何ですか?
SELECT ... FROM ... WHERE date > '8/27/2007 12:00:00 AM'
昨年のみのデータを取得する必要があるクエリを作成しています。これを行う最善の方法は何ですか?
SELECT ... FROM ... WHERE date > '8/27/2007 12:00:00 AM'
以下は、現在の日付に -1 年を加算します。
SELECT ... From ... WHERE date > 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'
BOL で dateadd を調べる
dateadd(yy,-1,getdate())
最も読みやすいIMO:
SELECT * FROM TABLE WHERE Date >
DATEADD(yy, -1, CONVERT(datetime, CONVERT(varchar, GETDATE(), 101)))
どれの:
今日の真夜中を取得するためのDATEDIFFとDATEADDのバリアントがありますが、それらはかなり鈍い傾向があります(ただし、パフォーマンスはわずかに向上します。データのフェッチに必要な読み取りと比較して気付くことはありません)。
GETDATE()
現在の日付と時刻を返します。
昨年が昨年の今日の真夜中に始まる場合(元の例のように)、次のようなものを使用する必要があります。
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
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
「SQLのみ」がある場合は、他の提案が適しています。
ただし、可能であれば、プログラムで日付を計算し、SQL クエリに文字列として挿入することをお勧めします。
少なくとも大きなテーブル (つまり、数百万行、おそらく結合と組み合わせたもの) の場合、オプティマイザーがよりうまく機能するため、速度が大幅に向上します。
DATEADD 関数の引数:
DATEADD (*datepart* , *number* , *date* )
datepartは次のとおりです: yy、qq、mm、dy、dd、wk、dw、hh、mi、ss、ms
numberは、date の datepart に追加される int に解決できる式です
dateは、時刻、日付、smalldatetime、datetime、datetime2、または datetimeoffset 値に解決できる式です。