143

SQL Server 2000 および 2005 の場合:

  • WHEREこれらの2つの句の違いは何ですか?
  • どのシナリオでどれを使用する必要がありますか?

クエリ 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 はもともと欠落していたため、クエリは構文的に間違っていました)

4

10 に答える 10

147

それらは同一です:BETWEENは、両方の値を含む質問の長い構文の省略形です ( EventDate >= '10/15/2009' and EventDate <= '10/19/2009')。

BETWEEN値の一方または両方を含める必要がないため、機能しない代替の長い構文を使用してください。

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

<(2 番目の状態ではなく注意してください<=。)

于 2009-10-27T11:40:54.660 に答える
42

それらは同じです。

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

<= 20/10/2009

次と同じではありません:

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

(に対して一致します<= 20/10/2009 00:00:00.000)

于 2009-10-27T11:41:43.707 に答える
16

BETWEEN読みやすく維持しやすいですが、これは閉じた間隔であり、前述のように、時間コンポーネントがなくても日付に問題が発生する可能性があるため、その使用はほとんどお勧めしません。

たとえば、月単位のデータを扱う場合、日付を比較するのが一般的ですBETWEEN first AND lastが、実際には、通常はこれを書く方が簡単です(dt >= first AND dt < next-first時間部分の問題も解決します)。 .lastnext-first

さらに、もう 1 つの注意点は、下限と上限を正しい順序(つまりBETWEEN low AND high) で指定する必要があることです。

于 2009-10-27T13:24:19.070 に答える
4

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

それらは同一であるため、速度やその他の点で実際に違いはありません。より自然に見える方を使用してください。

于 2009-10-27T11:41:18.027 に答える
4

@marc_s、@Cloudなどで言及されているように。それらは基本的に閉範囲と同じです。

ただし、小数の時間値は、閉じた範囲 (greater-or-equal およびless-or-equal )では問題を引き起こす可能性があります。可能な限り最後の瞬間。

そのため、クエリを次のように書き換える必要があります。

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

BETWEENハーフオープン間隔では機能しないため、おそらくエラーであるため、それを使用する日付/時刻クエリを常によく調べます。

于 2009-10-27T11:52:57.540 に答える
4

range の 1 つのフィールドをチェックBETWEENしていることを読者に即座に明らかにするので、私は を少し好みます。これは、テーブルに類似したフィールド名がある場合に特に当てはまります。

たとえば、私たちのテーブルに atransactiondateと a の両方があるtransitiondate場合、私が読んだ場合

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、構文エラーになり、すぐに修正されます。

于 2009-10-27T13:17:56.370 に答える
3

唯一の違いは、各クエリのシンタックス シュガーの量だと思います。BETWEEN は、2 番目のクエリとまったく同じことを巧妙に表現したものです。

私が気付いていないRDBMS固有の違いがあるかもしれませんが、そうは思いません。

于 2009-10-27T11:41:32.660 に答える
2

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

于 2009-10-27T11:42:21.240 に答える