SQL Server:過去1年間のみのデータを取得する


98

昨年だけデータを取得する必要があるクエリを書いています。これを行う最良の方法は何ですか?

SELECT ... FROM ... WHERE date > '8/27/2007 12:00:00 AM'

回答:


196

次の例では、現在の日付に-1年が加算されます。

SELECT ... From ... WHERE date > DATEADD(year,-1,GETDATE())

1
あなたのものはきれいですが、ここに私が持っていたものがあります:YEAR(GETDATE())-1
PCPGMR '21 / 01/15

2
これは日付ではなく数値を返すため、その日付の年を計算せずにそれを日付と比較することはできません。これにより、2014年12月31日と2015年1月1日の誤った結果が返されます。これは、年は異なりますが、年は異なります...
samjudson

正しい。年を年数で比較する必要があったので、たとえば2013年から2014年までのデータは年しかありませんでした。私のコメントははっきりしていませんでした。ありがとう
PCPGMR 2015年

このクエリを実行するとエラーメッセージが表示されます... "FUNCTION DatabaseName.DATEADD does not exist"何か提案はありますか?
Marcello Perri

10

前の暦年の結果を選択するのに役立つ解決策を探しているときに、このページを見つけました。上記の結果のほとんどは、過去365日間のアイテムを返しているようですが、私にはうまくいきませんでした。

同時に、次のコードで私のニーズを解決するのに十分な方向性が与えられました-私と同じニーズを持ち、解決策を探す際にこのページに出くわす可能性がある他の人のためにここに投稿します。

SELECT .... FROM .... WHERE year(*your date column*) = year(DATEADD(year,-1,getdate()))

上記のおかげで私が必要なものにたどり着くことができました。


7

まあ、私はここで何かが欠けていると思います。ユーザーは、過去365日間ではなく、昨年のデータを取得したいと考えています。大きな違いがあります。私の意見では、昨年のデータは2007年のすべてのデータです(現在2008年にいる場合)。したがって、正しい答えは次のとおりです。

SELECT ... FROM ... WHERE YEAR(DATE) = YEAR(GETDATE()) - 1

次に、このクエリを制限する場合は、他のフィルターを追加できますが、常に昨年を検索します。

SELECT ... FROM ... WHERE YEAR(DATE) = YEAR(GETDATE()) - 1 AND DATE > '05/05/2007'

これは大きなテーブルではパフォーマンスが非常に悪くなり、クエリはすべてのレコードをループして日付の年の値を評価します。日付範囲を使用する方がよいでしょう
Adriaan Davel


4

最も読みやすいIMO:

SELECT * FROM TABLE WHERE Date >
   DATEADD(yy, -1, CONVERT(datetime, CONVERT(varchar, GETDATE(), 101)))

どれ:

  1. 現在の日時を取得しますGETDATE()=#8/27/2008 10:23 am#
  2. フォーマット101の文字列に変換しますCONVERT(varchar、#8/27/2008 10:23 am#、101)= '8/27/2007'
  3. 日時に変換CONVERT(datetime、 '8/27/2007')=#8/27/2008 12:00 AM#
  4. 1年DATEADD(yy、-1、#8/27/2008 12:00 AM#)を減算します=#8/27/2007 12:00 AM#

DATEDIFFとDATEADDには、今日の真夜中を取得するバリアントがありますが、どちらかと言えば鈍い傾向があります(データのフェッチに必要な読み取りと比較すると、パフォーマンスはやや優れています-気が付かないでしょう)。


2

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

0

「SQLのみ」を使用している場合は、他の提案が適しています。

ただし、可能であれば、プログラムで日付を計算し、SQLクエリに文字列として挿入することをお勧めします。

少なくとも大きなテーブル(つまり、数百万行、場合によっては結合と組み合わせる)の場合、オプティマイザがより適切に機能できるため、速度が大幅に向上します。


2
パラメータ化された文字列を作成し、その値を文字列自体に配置しないことをお勧めします...
Adriaan Davel

0

DATEADD関数の引数:

DATEADD (*datepart* , *number* , *date* )

datepartは、yy、qq、mm、dy、dd、wk、dw、hh、mi、ss、msです。

数値は、日付の日付部分に追加されるintに解決できる式です

dateは、時刻、日付、smalldatetime、datetime、datetime2、またはdatetimeoffset値に解決できる式です。


0
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

1
これは問題に対処していません。
Nathan Skerl、

また、ループは一般的にSQLには良くありません
StingyJack

0

私は@DE Whiteのように、元の質問とは似ているが異なる理由でここに来ました。元の質問では、過去365日間を尋ねています。@samjudsonの答えはそれを提供します。@DE Whiteの回答は、前年の結果を返します。

私のクエリは、現在の日付までの前年まで機能するという点で少し異なります。

SELECT .... FROM .... WHERE year(date) > year(DATEADD(year, -2, GETDATE()))

たとえば、2017年2月17日の場合、このクエリは2016年1月1日から2017年2月17日までの結果を返します。


0

私にも同様の問題がありましたが、以前のコーダーはmm-yyyy形式の日付しか提供しませんでした。私の解決策は単純ですが、一部にとって役立つかもしれません(また、開始スペースと終了スペースが削除されていることを確認したかったのです)。

SELECT ... FROM ....WHERE 
CONVERT(datetime,REPLACE(LEFT(LTRIM([MoYr]),2),'-
','')+'/01/'+RIGHT(RTRIM([MoYr]),4)) >=  DATEADD(year,-1,GETDATE())

0

何らかの理由で、上記の結果はどれも私にとってはうまくいきませんでした。

これにより、過去365日が選択されます。

 SELECT ... From ... WHERE date BETWEEN CURDATE() - INTERVAL 1 YEAR AND CURDATE()

これが機能するバージョンのMSSQLサーバーを追加できると便利です。
itwasntme
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.