Например, может
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 возвращает TRUE, если значение test_expression больше или равно значению begin_expression и меньше или равно значению end_expression.
DateTime Caveat
NB: с DateTimes вы должны быть осторожны; если указана только дата, значение берется по состоянию на полночь этого дня; во избежание пропуска времени в вашей конечной дате или повторения захвата данных следующего дня в полночь в нескольких диапазонах ваша конечная дата должна быть за 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'
Вычитание 3 мс из даты сделает вас уязвимыми для пропущенных строк в окне 3 мс. Правильное решение также самое простое:
where myDateTime >= '20160601' AND myDateTime < '20160701'
CONVERT
в DateTime на сегодняшний день , так как это делают индексы бесполезные. Используйте стандартWHERE OrderDate >= '20160601' AND OrderDate < '20160701'
. Кроме того, обязательно используйтеyyyymmdd
, так какyyyy-mm-dd
это зависит от локали, и будет неверно истолковано в зависимости от настроек вашего сервераmdy, dmy, ymd, ydm, myd, and dym
.Да, но будьте осторожны при использовании между датами.
действительно интерпретируется как 12 утра, или
поэтому пропустим все, что произошло в день 31 января. В этом случае вам придется использовать:
или
ОБНОВЛЕНИЕ : вполне возможно иметь записи, созданные в течение этой последней секунды дня, с датой и временем уже
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
тами ,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 = 3
исключена? ЕгоStart
значение равно значениюBETWEEN
верхней границы иBETWEEN
является включающим диапазоном, а не исключительным верхним ограниченным диапазоном.если вы нажмете это и не захотите попробовать добавить день в коде, то пусть это сделает БД ..
Если вы включите часть времени: убедитесь, что она относится к полуночи. В противном случае вы можете просто пропустить время:
и не переживай об этом.
источник
источник
Если тип данных столбца - время-дата, вы можете сделать следующее, чтобы исключить время из даты-времени и сравнить только диапазон дат.
источник
Это включает в себя границы.
источник
Я всегда использовал это:
ГДЕ myDate МЕЖДУ startDate И (endDate + 1)
источник