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

Например, может

SELECT foo
FROM bar
WHERE foo BETWEEN 5 AND 10

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

Ответ 1

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

Из книг в Интернете:

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

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

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

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

where myDateTime between '2016-06-01' and dateadd(millisecond, -3, '2016-07-01')

то есть.

where myDateTime between '2016-06-01 00:00:00.000' and '2016-07-01 23:59:59.997'

Ответ 2

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

BETWEEN '01/01/2009' AND '01/31/2009'

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

BETWEEN '01/01/2009 00:00:00' AND '01/31/2009 00:00:00'

так что пропустит все, что произошло в течение 31 января. В этом случае вам придется использовать:

myDate >= '01/01/2009 00:00:00' AND myDate < '02/01/2009 00:00:00'  --CORRECT!

или

BETWEEN '01/01/2009 00:00:00' AND '01/31/2009 23:59:59' --WRONG! (see update!)

ОБНОВЛЕНИЕ. Вполне возможно, что записи создаются в течение последней второй половины дня с дате времени еще в 01/01/2009 23:59:59.997!!

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

Используйте вместо этого подход myDate >= (firstday) AND myDate < (Lastday+1).

Хорошо статья об этой проблеме здесь.

Ответ 3

Пример реального мира из SQL Server 2008.

alt text

Ответ 4

если вы нажмете это, и не хотите пытаться обработать добавление дня в код, а затем дайте БД сделать это.

myDate >= '01/01/2009 00:00:00' AND myDate < DATEADD(day,1,'01/01/2009 00:00:00')

Ответ 5

МЕЖДУ (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.

Примечания

Чтобы указать эксклюзивный диапазон, используйте больше ( > ) и меньше операторов (<). Если какой-либо вклад в МЕЖДУ ИЛИ НЕ МЕЖДУ предикатом NULL, результат НЕИЗВЕСТНО.

Значение результата

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

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

Ответ 6

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

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

Ответ 7

Он включает границы.

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

Ответ 8

Я всегда использовал это:

ГДЕ myDate МЕЖДУ startDate И (endDate + 1)