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 86

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