質問

過去 1 年間のみのデータを取得する必要があるクエリを作成しています。これを行うための最良の方法は何ですか?

SELECT ... FROM ... WHERE date > '8/27/2007 12:00:00 AM'
役に立ちましたか?

解決

次の例では、現在の日付に -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

このクエリを制限したい場合は、他のフィルタを追加できますが、常に過去 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)))

どれの:

  1. 現在の日時を取得します GETDATE() = #2008/8/27 10:23am#
  2. 形式 101 の文字列に変換します CONVERT(varchar, #2008/8/27 10:23am#, 101) = '2007/8/27'
  3. 日付時刻に変換します CONVERT(日時, '2007/8/27') = #2008/8/27 12:00AM#
  4. 1年を減算します DATEADD(yy, -1, #2008/8/27 12:00AM#) = #2007/8/27 12:00AM#

今日の午前 0 時を取得するための 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 クエリに文字列として挿入します。

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

DATEADD 関数の引数:

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

日付部分 可能性があるのは次のとおりです:yy、qq、mm、dy、dd、wk、dw、hh、mi、ss、ms

番号 date の datepart に追加される int に解決できる式です。

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

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

私は@D.E.が好きです。ホワイトさんは、元の質問とは似ていますが、異なる理由でここに来ました。元の質問では、過去 365 日について尋ねています。@samjudsonの答えはそれを提供します。@D.E.ホワイトの答えは、前暦年の結果を返します。

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

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

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

私も同様の問題を抱えていましたが、以前のコーダーでは日付が mm-yyyy 形式でしか提供されませんでした。私の解決策はシンプルですが、一部の人には役立つかもしれません(また、最初と最後のスペースが削除されていることを確認したかったのです)。

SELECT ... FROM ....WHERE 
CONVERT(datetime,REPLACE(LEFT(LTRIM([MoYr]),2),'-
','')+'/01/'+RIGHT(RTRIM([MoYr]),4)) >=  DATEADD(year,-1,GETDATE())
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top