250

たとえば、

SELECT foo
FROM bar
WHERE foo BETWEEN 5 AND 10

5 と 10 を選択するか、範囲から除外しますか?

4

8 に答える 8

274

BETWEEN 演算子は包括的です。

Books Online から:

BETWEEN は、test_expression の値が begin_expression の値以上で end_expression の値以下の場合に TRUE を返します。

DateTime の警告

注意: DateTimes では注意が必要です。日付のみが指定されている場合、値はその日の午前 0 時の時点で取得されます。終了日内の時間の欠落を回避したり、複数の範囲で翌日の午前 0 時にデータのキャプチャを繰り返したりしないようにするには、終了日を終了日の翌日の午前 0 時 3 ミリ秒前にする必要があります。3 ミリ秒未満の場合、値は翌日の午前 0 時に切り上げられます。

たとえば、2016 年 6 月以内にすべての値を取得するには、次のコマンドを実行する必要があります。

where myDateTime between '20160601' and DATEADD(millisecond, -3, '20160701')

すなわち

where myDateTime between '20160601 00:00:00.000' and '20160630 23:59:59.997'

datetime2 と datetimeoffset

日付から 3 ミリ秒を差し引くと、3 ミリ秒のウィンドウから行が失われる可能性があります。正しい解決策は、最も単純なものでもあります。

where myDateTime >= '20160601' AND myDateTime < '20160701'
于 2009-04-14T22:36:25.440 に答える
264

はい。ただし、日付に between を使用する場合は注意してください。

BETWEEN '20090101' AND '20090131'

実際には午前 12 時と解釈されます。

BETWEEN '20090101 00:00:00' AND '20090131 00:00:00'

そのため、1 月 31 日の日中に発生したものはすべて失われます。この場合、以下を使用する必要があります。

myDate >= '20090101 00:00:00' AND myDate < '20090201 00:00:00'  --CORRECT!

また

BETWEEN '20090101 00:00:00' AND '20090131 23:59:59' --WRONG! (see update!)

UPDATE : 1 日の最後の 1 秒以内に、datetime が20090101 23:59:59.997!!まで作成されたレコードを持つことは完全に可能です。

このため、このBETWEEN (firstday) AND (lastday 23:59:59)アプローチはお勧めしません。

myDate >= (firstday) AND myDate < (Lastday+1)代わりにアプローチを使用してください。

この問題に関する良い記事はこちら.

于 2009-04-14T23:00:17.097 に答える
16

SQL Server 2008 の実例。

ソースデータ:

ID    Start
1     2010-04-30 00:00:01.000
2     2010-04-02 00:00:00.000
3     2010-05-01 00:00:00.000
4     2010-07-31 00:00:00.000

クエリ:

SELECT
    *
FROM
    tbl
WHERE
    Start BETWEEN '2010-04-01 00:00:00' AND '2010-05-01 00:00:00'

結果:

ID    Start
1     2010-04-30 00:00:01.000
2     2010-04-02 00:00:00.000

代替テキスト

于 2010-07-30T19:45:02.690 に答える
13

これにヒットし、コードで 1 日を追加することを実際に試みて処理したくない場合は、DB に実行させてください。

myDate >= '20090101 00:00:00' AND myDate < DATEADD(day,1,'20090101 00:00:00')

時間の部分を含める場合: 午前 0 時を参照していることを確認してください。それ以外の場合は、単に時間を省略できます。

myDate >= '20090101' AND myDate < DATEADD(day,1,'20090101')

心配する必要はありません。

于 2011-12-26T18:29:17.123 に答える
12

BETWEEN (Transact-SQL)

テストする ( n ) (包括的) 範囲を指定します。

test_expression [ NOT ] BETWEEN begin_expression AND end_expression

引数

test_expression

begin_expression と end_expression で定義された範囲でテストする式です。test_expression は、begin_expression と end_expression の両方と同じデータ型でなければなりません。

NOT

述語の結果を否定することを指定します。

begin_expression

任意の有効な式です。begin_expression は、test_expression および end_expression の両方と同じデータ型である必要があります。

end_expression

任意の有効な式です。end_expression は、test_expression および begin_expression の両方と同じデータ型である必要があります。

AND

test_expression が begin_expression と end_expression で示される範囲内にある必要があることを示すプレースホルダーとして機能します。

備考

排他的範囲を指定するには、大なり演算子 (>) および小なり演算子 (<) を使用します。BETWEEN または NOT BETWEEN 述語への入力が NULL の場合、結果は UNKNOWN になります。

結果値

BETWEEN は、test_expression の値が begin_expression の値以上で end_expression の値以下の場合に TRUE を返します。

NOT BETWEEN は、test_expression の値が begin_expression の値より小さいか end_expression の値より大きい場合に TRUE を返します。

于 2009-04-14T22:40:44.990 に答える
4

列のデータ型がdatetimeの場合、次のようにしてdatetimeから時間を削除し、日付範囲のみを比較できます。

where cast(getdate() as date) between cast(loginTime as date) and cast(logoutTime as date)
于 2014-01-30T02:57:35.940 に答える
-3

私はいつもこれを使ってきました:

WHERE myDate BETWEEN startDate AND (endDate+1)

于 2015-03-24T01:32:22.187 に答える