回答:
BETWEEN演算子は包括的です。
Books Onlineから:
BETWEENは、test_expressionの値がbegin_expressionの値以上で、end_expressionの値以下の場合にTRUEを返します。
日時の警告
注意:DateTimesでは注意が必要です。日付のみが指定されている場合、値はその日の真夜中の時点で取得されます。終了日の時間を逃したり、翌日のデータを複数の範囲で午前0時に繰り返し取得したりしないようにするには、終了日の日付を、当日の午前0時の3ミリ秒前にする必要があります。これとその値よりも小さい場合は3ミリ秒となり、値は翌日の真夜中に切り上げられます。
たとえば、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'
CONVERT
WHERE OrderDate >= '20160601' AND OrderDate < '20160701'
yyyymmdd
yyyy-mm-dd
mdy, dmy, ymd, ydm, myd, and dym
はい。ただし、日付を間で使用する場合は注意してください。
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!)
更新:日付が遅くても、その日の最後の秒の間にレコードを作成することは完全に可能です20090101 23:59:59.997
!!
このため、このBETWEEN (firstday) AND (lastday 23:59:59)
アプローチは推奨されません。
myDate >= (firstday) AND myDate < (Lastday+1)
代わりにアプローチを使用してください。
WHERE col BETWEEN 'a' AND 'z'
、たとえばz行のほとんどを除外します。
BETWEEN 5 AND 10
含まれていないことを指摘することに類似しています10.2
...
CAST
INGのdatetime
ようDATE
に動作します:CAST(DATE_TIME_COL AS DATE) BETWEEN '01/01/2009' AND '01/31/2009'
。
It is entirely possible to have records created within that last second of the day, with a datetime as late as 01/01/2009 23:59:59.997
<-使用することができなかった、AND '01/31/2009 23:59:59.99999999'
または9がいくつも必要
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
ID = 3
除外されているのはなぜですか?そのStart
値はBETWEEN
上限値に等しくBETWEEN
、包括的な範囲であり、排他的な上限範囲ではありません。
BETWEEN(Transact-SQL)
テストするa(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を返します。
境界も含まれます。
declare @startDate date = cast('15-NOV-2016' as date)
declare @endDate date = cast('30-NOV-2016' as date)
create table #test (c1 date)
insert into #test values(cast('15-NOV-2016' as date))
insert into #test values(cast('20-NOV-2016' as date))
insert into #test values(cast('30-NOV-2016' as date))
select * from #test where c1 between @startDate and @endDate
drop table #test
RESULT c1
2016-11-15
2016-11-20
2016-11-30
declare @r1 int = 10
declare @r2 int = 15
create table #test1 (c1 int)
insert into #test1 values(10)
insert into #test1 values(15)
insert into #test1 values(11)
select * from #test1 where c1 between @r1 and @r2
drop table #test1
RESULT c1
10
11
15
私はいつもこれを使ってきました:
どこmyDate BETWEEN startDate AND(endDate + 1)