SQL: между vs =
В 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'
(Edit: вторая дата события изначально отсутствовала, поэтому запрос был синтаксически неправильным)
9 ответов:
они идентичны:
BETWEEN
является сокращением для более длинного синтаксиса в вопросе.используйте альтернативный более длинный синтаксис, где
BETWEEN
не работает, например,Select EventId,EventName from EventMaster where EventDate >= '10/15/2009' and EventDate < '10/18/2009'
(Примечание
<
, а не<=
во втором состоянии.)
они одинаковы.
одна вещь, чтобы быть осторожным, если вы используете это против даты и времени, матч для даты окончания будет началом дня:
<= 20/10/2009
- это не то же, что:
<= 20/10/2009 23:59:59
(это б матч против
<= 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 и др. они в основном одинаковы для закрытого диапазона.
но любые дробные значения времени могут вызвать проблемы с закрытым диапазоном (больше или равно и меньше или равно) в отличие от полуоткрытого диапазона (больше или равно и меньше, чем) с конечным значением после последний возможный момент.
таким образом, чтобы избежать того, что запрос должен быть переписан как:
SELECT EventId, EventName FROM EventMaster WHERE (EventDate >= '2009-10-15' AND EventDate < '2009-10-19') /* <<<== 19th, not 18th */
С
BETWEEN
не работает для полуоткрытых интервалов я всегда внимательно смотрю на любой запрос даты/времени, который его использует, так как это, вероятно, ошибка.
Я думаю, что единственная разница-это количество синтаксического сахара в каждом запросе. Между - Это просто гладкий способ сказать точно то же самое, что и второй запрос.
может быть какая-то специфическая разница в СУБД, о которой я не знаю, но я действительно так не думаю.
логически нет никакой разницы вообще. С точки зрения производительности нет-как правило, на большинстве СУБД-никакой разницы вообще.
посмотреть этот отличный пост в блоге С Аарон Бертран о том, почему вы должны изменить свой формат строки и как обрабатываются граничные значения в запросах диапазона дат.
у меня есть небольшое предпочтение
BETWEEN
потому что это мгновенно дает понять читателю, что вы проверяете одно поле для диапазона. Это особенно верно, если у вас есть похожие имена полей в таблице.если, скажем, наша таблица имеет оба
transactiondate
иtransitiondate
, если я читаюtransactiondate between ...
я сразу знаю, что оба конца теста против этого одного поля.
если я читаю
transactiondate>='2009-04-17' and transactiondate<='2009-04-22'
Я должен взять дополнительную момент, чтобы убедиться, что два поля одинаковые.
кроме того, поскольку запрос редактируется с течением времени, неаккуратный программист может разделить эти два поля. Я видел много запросов, которые говорят что-то вроде
where transactiondate>='2009-04-17' and salestype='A' and customernumber=customer.idnumber and transactiondate<='2009-04-22'
если они попробуют это с
BETWEEN
, конечно, это будет синтаксическая ошибка и оперативно исправлена.