Включает ли MS SQL Server "между" границы диапазона?

, например, можно

SELECT foo
FROM bar
WHERE foo BETWEEN 5 AND 10

выберите 5 и 10 или они исключены из диапазона?

8 ответов


оператор BETWEEN включен.

Из Книг На Сайте:

BETWEEN возвращает TRUE, если значение аргумента test_expression больше или равно значению begin_expression и меньше или равно значению end_expression.

DateTime Предостережение

NB: с датами времени вы должны быть осторожны; если только дата задана, значение берется с полуночи в этот день; чтобы избежать пропущенных раз в пределах вашей конечной даты или повторяя захват данных следующего дня в полночь в нескольких диапазонах, ваша конечная дата должна быть за 3 миллисекунды до полуночи на следующий день после вашей даты. 3 миллисекунды, потому что меньше этого, и значение будет округлено до полуночи на следующий день.

например, чтобы получить все значения в июне 2016 года нужно выполнить:

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'

да, но будьте осторожны при использовании между дат.

BETWEEN '20090101' AND '20090131'

действительно интерпретируется как 12am, или

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

так что пропустите все, что произошло в течение дня 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!)

обновление: вполне возможно иметь записи, созданные в течение этой последней секунды дня, с datetime до20090101 23:59:59.997!!

по этой причине BETWEEN (firstday) AND (lastday 23:59:59) подход не рекомендуется.

использовать подход.

хороший статья по этому вопросу здесь.


реальный пример из 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

alt text


Если вы нажмете это, и не очень хотите пытаться обрабатывать добавление дня в коде, то пусть DB это сделает..

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

Если вы включаете часть времени: убедитесь, что она ссылается на полночь. В противном случае вы можете просто опустить время:

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

и не беспокойтесь об этом.


между (Transact-SQL)

указывает a (n) (включительно) диапазон для тестирования.

test_expression [ NOT ] BETWEEN begin_expression AND end_expression

Аргументы

test_expression

- это выражение для проверки в диапазоне, определенном begin_expression и end_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 возвращает TRUE, если значение аргумента test_expression больше или равно значению begin_expression и меньше или равно значение end_expression.

NOT BETWEEN возвращает TRUE, если значение test_expression меньше, чем значение begin_expression или больше чем значение end_expression.


Если тип данных столбца datetime, то вы можете сделать это, чтобы исключить время из datetime и сравнить только диапазон дат.

where cast(getdate() as date) between cast(loginTime as date) and cast(logoutTime as date)

оно включает в себя границы.

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 между startDate и (endDate+1)