速度 SQL:between<= および>=




sql between 速度 (8)

BETWEENは読んだり保守したりするのは簡単ですが、閉じた間隔であり、以前に述べたように、日付の問題である可能性があります(時間コンポーネントがなくても)。

例えば、毎月のデータを扱う場合は、 BETWEEN first AND lastで日付を比較するのが普通ですが、実際にはdt >= first AND dt < next-first (時間部分の問題も解決します)を書く方が簡単です。 last決定は通常、 next-firstものを決定するよりも1ステップ長い( next-first日を引くことにより)。

さらに、別の問題は、下限と上限が正しい順序で指定される必要があるということです(つまり、 BETWEEN low AND high )。

SQL Server 2000および2005の場合:

  • これら2つのWHERE節の違いは何ですか?
  • どのシナリオでどちらを使うべきですか?

クエリ1:

SELECT EventId, EventName
FROM EventMaster
WHERE EventDate BETWEEN '10/15/2009' AND '10/18/2009'

クエリ2:

SELECT EventId, EventName
FROM EventMaster
WHERE EventDate >='10/15/2009'
  AND EventDate <='10/18/2009'

(編集:2番目のEventdateがもともとなくなっていたため、構文的に間違っていました)


通常、違いはありませんBETWEENキーワードはすべてのRDBMSプラットフォームでサポートされていませんが、そうであれば、2つのクエリーは同一でなければなりません。

同じものなので、スピードやその他の点では区別がありません。あなたにとってより自然なものを使用してください。


Aaron Bertrandのこの優れたブログ記事を参照して、文字列形式を変更する理由と日付範囲クエリで境界値をどのように処理するかを確認してください。


あなたが範囲のために1つのフィールドをチェックていること読者に即座にBETWEENので、私は少しでも好きです 。 これは、テーブルに似たフィールド名がある場合に特に当てはまります。

たとえば、テーブルにtransactiondatetransitiondate両方がある場合、私が読んだ場合

transactiondate between ...

私はすぐにテストの両端がこの1つのフィールドに対抗していることを知っています。

私が読むなら

transactiondate>='2009-04-17' and transactiondate<='2009-04-22'

私は2つのフィールドが同じであることを確認するために余分な時間を取らなければならない。

また、クエリが時間の経過とともに編集されると、厄介なプログラマーが2つのフィールドを分離することがあります。 私は何かのような質問をたくさん見た

where transactiondate>='2009-04-17'
  and salestype='A'
  and customernumber=customer.idnumber
  and transactiondate<='2009-04-22'

彼らがBETWEENでこれを試しても、それは構文エラーとなり、すぐに修正されます。


彼らは同じです: BETWEENは、質問の長い構文の略語です。

BETWEENが動作しない場合は、代替の長い構文を使用します。

Select EventId,EventName from EventMaster
where EventDate >= '10/15/2009' and EventDate < '10/18/2009'

< 2番目の条件で<=ではなく注<注)。


論理的には全く違いはありません。 パフォーマンス面では、通常、ほとんどのDBMSでは違いはありません。


@marc_s、@Cloud、et al。 彼らは基本的に閉鎖された範囲で同じです。

しかし、分数時間の値は、後に半値範囲(大または等しい、 より小さい )とは対照的に、閉じた範囲(大きいか等しいか小さいか )で問題を引き起こす可能性があります。最後の可能な瞬間。

したがって、クエリを次のように書き直す必要はありません。

SELECT EventId, EventName
  FROM EventMaster
 WHERE (EventDate >= '2009-10-15' AND
        EventDate <  '2009-10-19')    /* <<<== 19th, not 18th */

BETWEENは半開きの間隔では機能しないので、おそらくエラーがあるので、それを使用する日時問合せを常に見ています。


彼らは同じです。

注意しなければならないことの1つは、DATETIMEに対してこれを使用している場合です。終了日の一致は、その日の始まりになります。

<= 20/10/2009

同じではありません:

<= 20/10/2009 23:59:59

<= 20/10/2009 00:00:00.000





between