2012-03-27 10 views
18

は、これはおそらく、where句シンプルですが、私は(日時です)COLUMNXから私はちょうど一年= 2010SQLは*列から年= 2010

すべての行をしたい、と言いたい:

select * from mytable where Columnx = 
+0

いくつかの余分な情報を動作します:http://stackoverflow.com/questions/7870943/how-efficient-is-the-yeardate-function – Simon

答えて

26
select * from mytable where year(Columnx) = 2010 

あなたはCOLUMNXにインデックスを持っている場合は、機能を使用する場合、SQLServerのは、それを使用することはありません「年」(またはその他の機能)。

Columnx> = '01012010'とColumnx < = '31122010'のような間隔で検索する方法と、year(Columnx)式を持つ計算列を作成する方法がありますが、インデックスそれ、と私はあなたが2010年のすべての行をしたいことを理解していれば、その後、その後、この新しいコラム

+0

パフォーマンスが傷ついていない場合は、このメソッドが 'Columnx'カラムのインデックスを使用していないと思います。 – Simon

+1

@imim - あなたは正しいので、関数内のカラムをラッピングすると、非sargableになります。この結果、フルスキャンになります。私はこれをしないだろう。日付をフィルタリングすることは非常に貧弱です。私はOPがあなたの答えを見ていることを強くお勧めします。 – MatBailie

+0

こんにちは@シモン、あなたのコメントありがとう、私は問題についての説明を追加しました。私は今までそれをやっていませんでした。なぜなら、OPはYear()関数で非常に単純な問題を抱えているからです。私は彼がこの時点でインデックスの使用について心配しているとは思わなかったからです。 – Diego

5

T-SQLなど。インデックスの使用(サイモンさんのコメントに答える)について

select * from t where year(Columnx) = 2010 
+3

機能で列をラップすることは、それが非検索引数可能になり。この結果、フルスキャンになります。私はこれをしないだろう。日付をフィルタリングすることは非常に貧弱です。私は非常にOPの@サイモンの答えを見てお勧めします。 – MatBailie

21

にフィルタを実行します。

select * 
    from mytable 
where Columnx >= '2010-01-01 00:00:00' 
     and Columnx < '2011-01-01 00:00:00' 
+2

+1 - OPが望んでいるものは***なのか、***はレンジシークのためのインデックスを利用しているのですか? – MatBailie

+3

はい、インデックスの使用を許可するため+1です。'where Columnx> = '2010-01-01'とColumnx <'2011-01-01'(効率の差はなく、コードの文字数は少なくて済む) –

1

その単純な

select * from myTable where year(columnX) = 2010 
+1

ラップする関数の中の列はそれを不可能にする。この結果、フルスキャンになります。私はこれをしないだろう。日付をフィルタリングすることは非常に貧弱です。私は非常にOPの@サイモンの答えを見てお勧めします。 – MatBailie

0

NB:あなたは今年、いくつかの基準日に基づくものにしたいなら、以下のコードはbetween文の日付を計算します。同様に

declare @referenceTime datetime = getutcdate() 
select * 
from myTable 
where SomeDate 
    between dateadd(year, year(@referenceTime) - 1900, '01-01-1900')      --1st Jan this year (midnight) 
    and dateadd(millisecond, -3, dateadd(year, year(@referenceTime) - 1900, '01-01-1901')) --31st Dec end of this year (just before midnight of the new year) 

、あなたはあなたのためのyear(@referenceDate)を交換、年の値を使用している場合基準年の値が

declare @referenceYear int = 2010 
select * 
from myTable 
where SomeDate 
    between dateadd(year,@referenceYear - 1900, '01-01-1900')      --1st Jan this year (midnight) 
    and dateadd(millisecond, -3, dateadd(year,@referenceYear - 1900, '01-01-1901')) --31st Dec end of this year (just before midnight of the new year) 
関連する問題