Умножение обычно быстрее - конечно, никогда медленнее. Однако, если это не очень важная скорость, запишите, какой бы ни является самым ясным.
Они идентичны: BETWEEN
- это сокращение для более длинного синтаксиса в вопросе.
Используйте альтернативный более длинный синтаксис, где BETWEEN
не работает, например,
Select EventId,EventName from EventMaster
where EventDate >= '10/15/2009' and EventDate < '10/18/2009'
(примечание <
, а не <=
во втором условии.)
Хотя BETWEEN
легко читать и поддерживать, я редко рекомендую его использовать, потому что это закрытый интервал, и, как упоминалось ранее, это может быть проблемой с датами - даже без компоненты времени.
Например, при работе с месячными данными часто сравнивают даты МЕЖДУ первым И последним
, но на практике это обычно проще записать dt> = first AND dt
last
обычно на один шаг длиннее, чем определение next-first
(путем вычитания дня).
Кроме того, еще одна проблема заключается в том, что нижнюю и верхнюю границы необходимо указывать в правильном порядке (то есть МЕЖДУ низким И высоким
).
Обычно нет никакой разницы - ключевое слово BETWEEN
не поддерживается на всех платформах СУБД, но если это так, то два запроса должны быть идентичны.
Поскольку они идентичны, на самом деле нет различий в скорости или чем-либо еще - используйте тот, который вам кажется более естественным.
Они одинаковы.
Следует остерегаться одного: если вы используете это для DATETIME, совпадением для даты окончания будет начало дня:
<= 20/10/2009
не то же самое, что:
<= 20/10/2009 23:59:59
(это будет соответствовать <= 20/10/2009 00: 00: 00.000
)
См. Это отличное сообщение в блоге от Аарона Бертрана о том, почему вам следует изменить формат строки и как обрабатываются граничные значения в запросах диапазона дат.
Логически никакой разницы нет. С точки зрения производительности, как правило, на большинстве СУБД нет никакой разницы.
Я думаю, единственная разница - это количество синтаксического сахара в каждом запросе. 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 ...
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
, конечно, это будет синтаксическая ошибка, которая будет быстро исправлена.