は、これはおそらく、where句シンプルですが、私は(日時です)COLUMNXから私はちょうど一年= 2010SQLは*列から年= 2010
すべての行をしたい、と言いたい:
select * from mytable where Columnx =
は、これはおそらく、where句シンプルですが、私は(日時です)COLUMNXから私はちょうど一年= 2010SQLは*列から年= 2010
すべての行をしたい、と言いたい:
select * from mytable where Columnx =
select * from mytable where year(Columnx) = 2010
:
あなたはCOLUMNXにインデックスを持っている場合は、機能を使用する場合、SQLServerのは、それを使用することはありません「年」(またはその他の機能)。
Columnx> = '01012010'とColumnx < = '31122010'のような間隔で検索する方法と、year(Columnx)式を持つ計算列を作成する方法がありますが、インデックスそれ、と私はあなたが2010年のすべての行をしたいことを理解していれば、その後、その後、この新しいコラム
パフォーマンスが傷ついていない場合は、このメソッドが 'Columnx'カラムのインデックスを使用していないと思います。 – Simon
@imim - あなたは正しいので、関数内のカラムをラッピングすると、非sargableになります。この結果、フルスキャンになります。私はこれをしないだろう。日付をフィルタリングすることは非常に貧弱です。私はOPがあなたの答えを見ていることを強くお勧めします。 – MatBailie
こんにちは@シモン、あなたのコメントありがとう、私は問題についての説明を追加しました。私は今までそれをやっていませんでした。なぜなら、OPはYear()関数で非常に単純な問題を抱えているからです。私は彼がこの時点でインデックスの使用について心配しているとは思わなかったからです。 – Diego
T-SQLなど。インデックスの使用(サイモンさんのコメントに答える)について
select * from t where year(Columnx) = 2010
機能で列をラップすることは、それが非検索引数可能になり。この結果、フルスキャンになります。私はこれをしないだろう。日付をフィルタリングすることは非常に貧弱です。私は非常にOPの@サイモンの答えを見てお勧めします。 – MatBailie
にフィルタを実行します。
select *
from mytable
where Columnx >= '2010-01-01 00:00:00'
and Columnx < '2011-01-01 00:00:00'
+1 - OPが望んでいるものは***なのか、***はレンジシークのためのインデックスを利用しているのですか? – MatBailie
はい、インデックスの使用を許可するため+1です。'where Columnx> = '2010-01-01'とColumnx <'2011-01-01'(効率の差はなく、コードの文字数は少なくて済む) –
その単純な
select * from myTable where year(columnX) = 2010
ラップする関数の中の列はそれを不可能にする。この結果、フルスキャンになります。私はこれをしないだろう。日付をフィルタリングすることは非常に貧弱です。私は非常にOPの@サイモンの答えを見てお勧めします。 – MatBailie
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)
いくつかの余分な情報を動作します:http://stackoverflow.com/questions/7870943/how-efficient-is-the-yeardate-function – Simon