115

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

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

12 に答える 12

230

以下は、現在の日付に -1 年を加算します。

SELECT ... From ... WHERE date > DATEADD(year,-1,GETDATE())
于 2008-08-27T14:12:28.437 に答える
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'
于 2008-08-27T14:23:22.203 に答える
5

BOL で dateadd を調べる

dateadd(yy,-1,getdate())
于 2008-08-27T14:12:53.990 に答える
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. フォーマット101CONVERT(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のバリアントがありますが、それらはかなり鈍い傾向があります(ただし、パフォーマンスはわずかに向上します。データのフェッチに必要な読み取りと比較して気付くことはありません)。

于 2008-08-27T14:26:07.877 に答える
2

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
于 2008-08-27T14:20:22.163 に答える
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
于 2012-05-18T17:58:44.590 に答える
0

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

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

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

于 2008-08-27T15:13:39.010 に答える
0

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 値に解決できる式です。

于 2011-09-21T14:29:28.473 に答える