В SQL Server 2000 и 2005:
- в чем разница между этими двумя
WHERE
пунктами? - какой из них я должен использовать в каких сценариях?
Запрос 1:
SELECT EventId, EventName
FROM EventMaster
WHERE EventDate BETWEEN '10/15/2009' AND '10/18/2009'
Запрос 2:
SELECT EventId, EventName
FROM EventMaster
WHERE EventDate >='10/15/2009'
AND EventDate <='10/18/2009'
(Изменить: вторая дата события изначально отсутствовала, поэтому запрос был синтаксически неверным)
Ответы:
Они идентичны:
BETWEEN
это сокращение от более длинного синтаксиса вопроса.Используйте альтернативный более длинный синтаксис, если
BETWEEN
он не работает, например(Обратите внимание,
<
а не<=
во втором условии.)источник
Они одинаковые.
Следует остерегаться одного: если вы используете это против DATETIME, совпадение для даты окончания будет началом дня:
не то же самое, что:
(это будет соответствовать
<= 20/10/2009 00:00:00.000
)источник
Хотя
BETWEEN
его легко читать и поддерживать, я редко рекомендую его использовать, потому что это закрытый интервал, и, как упоминалось ранее, это может быть проблемой с датами - даже без компонентов времени.Например, при работе с ежемесячными данными часто сравнивают даты
BETWEEN first AND last
, но на практике это обычно легче написатьdt >= first AND dt < next-first
(что также решает проблему временной части), поскольку определениеlast
обычно на один шаг дольше, чем определениеnext-first
(путем вычитания дня) .Кроме того, еще одна проблема заключается в том, что нижнюю и верхнюю границы необходимо указывать в правильном порядке (т
BETWEEN low AND high
. Е. ).источник
Как правило, разницы нет -
BETWEEN
ключевое слово не поддерживается на всех платформах СУБД, но если это так, два запроса должны быть идентичными.Поскольку они идентичны, на самом деле нет никакой разницы в скорости или чем-либо еще - используйте тот, который вам кажется более естественным.
источник
Как упоминалось @marc_s, @Cloud и др. в основном они одинаковы для закрытого диапазона.
Но любые дробные значения времени могут вызвать проблемы с закрытым диапазоном (больше или равно и меньше или равно ) , в отличие от полуоткрытую диапазона (больше или равно , и менее чем ) с конечным значением после последний возможный момент.
Поэтому, чтобы избежать этого, запрос следует переписать как:
Поскольку
BETWEEN
не работает для полуоткрытых интервалов, я всегда внимательно смотрю на любой запрос даты / времени, который его использует, поскольку это, вероятно, ошибка.источник
Я немного предпочитаю,
BETWEEN
потому что это сразу дает читателю понять, что вы проверяете одно поле для диапазона . Это особенно верно, если в вашей таблице есть похожие имена полей.Если, скажем, в нашей таблице есть и a,
transactiondate
и atransitiondate
, если я прочиталЯ сразу знаю, что оба конца теста против этого поля.
Если я прочитаю
Я должен воспользоваться дополнительным моментом, чтобы убедиться, что эти два поля совпадают.
Кроме того, поскольку запрос со временем редактируется, небрежный программист может разделить два поля. Я видел множество запросов, в которых говорилось что-то вроде
Если они попробуют это сделать
BETWEEN
, конечно, это будет синтаксическая ошибка, и она будет быстро исправлена.источник
Я думаю, единственная разница - это количество синтаксического сахара в каждом запросе. BETWEEN - это простой способ сказать то же самое, что и второй запрос.
Может быть какая-то особенная разница в СУБД, о которой я не знаю, но я так не думаю.
источник
По логике вообще никакой разницы. С точки зрения производительности, как правило, на большинстве СУБД нет никакой разницы.
источник
Посмотрите это отличное сообщение в блоге от Аарона Бертрана о том, почему вам следует изменить формат строки и как граничные значения обрабатываются в запросах диапазона дат.
источник
Отказ от ответственности: все нижеприведенное является анекдотическим и основано непосредственно на моем личном опыте. Любой, кто считает нужным провести более строгий эмпирический анализ, может провести его и проголосовать против, если я. Я также знаю, что SQL - это декларативный язык, и вам не нужно учитывать, КАК ваш код обрабатывается, когда вы его пишете, но, поскольку я ценю свое время, я это делаю.
Существует бесконечное количество логически эквивалентных утверждений, но я рассмотрю три (иш).
Случай 1: два сравнения в стандартном порядке (фиксированный порядок оценки)
Случай 2: Синтаксический сахар (порядок оценки не выбран автором)
Случай 3: два сравнения в образованном порядке (порядок оценки выбран во время написания)
Или
По моему опыту, случаи 1 и 2 не имеют каких-либо последовательных или заметных различий в производительности, поскольку они игнорируют набор данных.
Однако вариант 3 может значительно сократить время выполнения. В частности, если вы работаете с большим набором данных и у вас есть некоторые эвристические знания о том, будет ли A больше, чем MaxBound или меньше, чем MinBound, вы можете заметно улучшить время выполнения, используя случай 3 и упорядочивая сравнения соответственно.
Один из вариантов использования, который у меня есть, - это запрос большого набора исторических данных с неиндексированными датами для записей в пределах определенного интервала. При написании запроса я буду иметь представление о том, существует ли больше данных ДО указанного интервала или ПОСЛЕ указанного интервала, и могу соответственно упорядочить свои сравнения. У меня время выполнения сократилось наполовину в зависимости от размера набора данных, сложности запроса и количества записей, отфильтрованных при первом сравнении.
источник
A
больше ли оно, чем обе границы, просто проверьте, больше лиA
оно, чемMaxBound
. Ваш пост нуждается в корректировке.В этом сценарии
col BETWEEN ... AND ...
иcol <= ... and col >= ...
эквивалентны.Стандарт SQL определяет также предикат T461 Symmetric BETWEEN :
BETWEEN
требует сортировки значений. Например:С другой стороны:
Он работает точно так же, как обычно,
BETWEEN
но после сортировки значений сравнения.db <> демо скрипта
источник