たとえば、
SELECT foo
FROM bar
WHERE foo BETWEEN 5 AND 10
5 と 10 を選択するか、範囲から除外しますか?
たとえば、
SELECT foo
FROM bar
WHERE foo BETWEEN 5 AND 10
5 と 10 を選択するか、範囲から除外しますか?
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'
日付から 3 ミリ秒を差し引くと、3 ミリ秒のウィンドウから行が失われる可能性があります。正しい解決策は、最も単純なものでもあります。
where myDateTime >= '20160601' AND myDateTime < '20160701'
はい。ただし、日付に 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)
代わりにアプローチを使用してください。
この問題に関する良い記事はこちら.
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
これにヒットし、コードで 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')
心配する必要はありません。
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 を返します。
列のデータ型がdatetimeの場合、次のようにしてdatetimeから時間を削除し、日付範囲のみを比較できます。
where cast(getdate() as date) between cast(loginTime as date) and cast(logoutTime as date)
私はいつもこれを使ってきました:
WHERE myDate BETWEEN startDate AND (endDate+1)