SQL: МЕЖДУ по сравнению с <= и> =

Умножение обычно быстрее - конечно, никогда медленнее. Однако, если это не очень важная скорость, запишите, какой бы ни является самым ясным.

103
задан Oreo 8 February 2018 в 11:34
поделиться

9 ответов

Они идентичны: BETWEEN - это сокращение для более длинного синтаксиса в вопросе.

Используйте альтернативный более длинный синтаксис, где BETWEEN не работает, например,

Select EventId,EventName from EventMaster
where EventDate >= '10/15/2009' and EventDate < '10/18/2009'

(примечание <, а не <= во втором условии.)

]
107
ответ дан 24 November 2019 в 04:20
поделиться

Хотя BETWEEN легко читать и поддерживать, я редко рекомендую его использовать, потому что это закрытый интервал, и, как упоминалось ранее, это может быть проблемой с датами - даже без компоненты времени.

Например, при работе с месячными данными часто сравнивают даты МЕЖДУ первым И последним , но на практике это обычно проще записать dt> = first AND dt (который также решает проблему временной части) - поскольку определение last обычно на один шаг длиннее, чем определение next-first (путем вычитания дня).

Кроме того, еще одна проблема заключается в том, что нижнюю и верхнюю границы необходимо указывать в правильном порядке (то есть МЕЖДУ низким И высоким ).

13
ответ дан 24 November 2019 в 04:20
поделиться

Обычно нет никакой разницы - ключевое слово BETWEEN не поддерживается на всех платформах СУБД, но если это так, то два запроса должны быть идентичны.

Поскольку они идентичны, на самом деле нет различий в скорости или чем-либо еще - используйте тот, который вам кажется более естественным.

4
ответ дан 24 November 2019 в 04:20
поделиться

Они одинаковы.

Следует остерегаться одного: если вы используете это для DATETIME, совпадением для даты окончания будет начало дня:

<= 20/10/2009

не то же самое, что:

<= 20/10/2009 23:59:59

(это будет соответствовать <= 20/10/2009 00: 00: 00.000 )

34
ответ дан 24 November 2019 в 04:20
поделиться

См. Это отличное сообщение в блоге от Аарона Бертрана о том, почему вам следует изменить формат строки и как обрабатываются граничные значения в запросах диапазона дат.

2
ответ дан 24 November 2019 в 04:20
поделиться

Логически никакой разницы нет. С точки зрения производительности, как правило, на большинстве СУБД нет никакой разницы.

2
ответ дан 24 November 2019 в 04:20
поделиться

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

Могут быть некоторые специфические различия СУБД, о которых я не знаю, но я так не думаю.

3
ответ дан 24 November 2019 в 04:20
поделиться

Как упоминалось @marc_s, @Cloud и др. в основном они одинаковы для замкнутого диапазона.

Но любые дробные значения времени могут вызвать проблемы с замкнутым диапазоном (больше или равно и меньше или равно ), а не половиной -открыть диапазон (больше или равно и меньше, чем ) с конечным значением после последнего возможного момента.

Таким образом, чтобы избежать перезаписи запроса следующим образом:

SELECT EventId, EventName
  FROM EventMaster
 WHERE (EventDate >= '2009-10-15' AND
        EventDate <  '2009-10-19')    /* <<<== 19th, not 18th */

Поскольку BETWEEN не работает для полуоткрытых интервалов, я всегда внимательно смотрю на любой запрос даты / времени, который его использует, поскольку это, вероятно, ошибка.

4
ответ дан 24 November 2019 в 04:20
поделиться

Я немного предпочитаю BETWEEN , потому что это сразу дает читателю понять, что вы проверяете одно поле для диапазона . Это особенно верно, если у вас есть похожие имена полей в вашей таблице.

Если, скажем, наша таблица имеет как transactiondate , так и transitiondate , если я прочитал

transactiondate between ...

I сразу знайте, что оба конца теста против этого единственного поля.

Если я прочитаю

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

4
ответ дан 24 November 2019 в 04:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: