No SQL Server 2000 e 2005:
- qual é a diferença entre essas duas
WHERE
cláusulas? - qual devo usar em quais cenários?
Consulta 1:
SELECT EventId, EventName
FROM EventMaster
WHERE EventDate BETWEEN '10/15/2009' AND '10/18/2009'
Consulta 2:
SELECT EventId, EventName
FROM EventMaster
WHERE EventDate >='10/15/2009'
AND EventDate <='10/18/2009'
(Editar: o segundo Eventdate estava ausente originalmente, então a consulta estava sintaticamente errada)
Respostas:
Eles são idênticos:
BETWEEN
é uma abreviatura para a sintaxe mais longa na questão.Use uma sintaxe alternativa mais longa onde
BETWEEN
não funcionar, por exemplo(Observe em
<
vez de<=
na segunda condição.)fonte
Eles são os mesmos.
Deve-se ter cuidado: se você estiver usando isso em DATETIME, a correspondência para a data de término será o início do dia:
não é o mesmo que:
(ele iria corresponder contra
<= 20/10/2009 00:00:00.000
)fonte
Embora
BETWEEN
seja fácil de ler e manter, raramente recomendo seu uso porque é um intervalo fechado e, como mencionado anteriormente, isso pode ser um problema com datas - mesmo sem componentes de tempo.Por exemplo, ao lidar com dados mensais, muitas vezes é comum comparar datas
BETWEEN first AND last
, mas na prática isso geralmente é mais fácil de escreverdt >= first AND dt < next-first
(o que também resolve o problema da parte do tempo) - uma vez que determinarlast
geralmente é um passo mais longo do que determinarnext-first
(subtraindo um dia) .Além disso, outra pegadinha é que os limites inferior e superior precisam ser especificados na ordem correta (ou seja,
BETWEEN low AND high
).fonte
Normalmente, não há diferença - a
BETWEEN
palavra-chave não é suportada em todas as plataformas RDBMS, mas se for, as duas consultas devem ser idênticas.Como eles são idênticos, não há realmente nenhuma distinção em termos de velocidade ou qualquer outra coisa - use aquele que parecer mais natural para você.
fonte
Conforme mencionado por @marc_s, @Cloud, et al. eles são basicamente os mesmos para um intervalo fechado.
Mas quaisquer valores de tempo fracionário podem causar problemas com um intervalo fechado (maior ou igual e menor ou igual ) em oposição a um intervalo semiaberto (maior ou igual e menor que ) com um valor final após o último instante possível.
Portanto, para evitar que a consulta seja reescrita como:
Como
BETWEEN
não funciona para intervalos semiabertos, sempre analiso cuidadosamente qualquer consulta de data / hora que o utilize, pois provavelmente é um erro.fonte
Tenho uma ligeira preferência por
BETWEEN
porque torna imediatamente claro para o leitor que você está verificando um campo para um intervalo . Isso é especialmente verdadeiro se você tiver nomes de campo semelhantes em sua tabela.Se, digamos, nossa mesa tiver um
transactiondate
e umtransitiondate
, se eu lerEu sei imediatamente que ambas as pontas do teste são contra esse campo.
Se eu ler
Preciso de um minuto extra para ter certeza de que os dois campos são iguais.
Além disso, à medida que uma consulta é editada ao longo do tempo, um programador desleixado pode separar os dois campos. Já vi muitas consultas que dizem algo como
Se eles tentarem fazer isso com um
BETWEEN
, é claro, será um erro de sintaxe e será corrigido imediatamente.fonte
Acho que a única diferença é a quantidade de açúcar sintático em cada consulta. BETWEEN é apenas uma maneira inteligente de dizer exatamente o mesmo que a segunda consulta.
Pode haver alguma diferença específica de RDBMS da qual não estou ciente, mas realmente não acho.
fonte
Logicamente, não há diferença alguma. Em termos de desempenho, normalmente, na maioria dos SGBDs, não há diferença alguma.
fonte
Veja esta excelente postagem de Aaron Bertrand sobre por que você deve alterar o formato da string e como os valores limite são tratados em consultas de intervalo de datas.
fonte
Aviso Legal: Tudo abaixo é apenas anedótico e tirado diretamente de minha experiência pessoal. Qualquer pessoa que se sinta à vontade para conduzir uma análise empiricamente mais rigorosa é bem-vinda para realizá-la e votar contra, se eu for. Também estou ciente de que SQL é uma linguagem declarativa e você não deve considerar COMO seu código é processado ao escrevê-lo, mas, porque eu valorizo meu tempo, eu sim.
Existem infinitas declarações logicamente equivalentes, mas considerarei três (ish).
Caso 1: duas comparações em uma ordem padrão (ordem de avaliação corrigida)
Caso 2: Açúcar sintático (a ordem de avaliação não é escolhida pelo autor)
Caso 3: Duas comparações em uma ordem educada (ordem de avaliação escolhida no momento da escrita)
Ou
Na minha experiência, o Caso 1 e o Caso 2 não apresentam diferenças consistentes ou notáveis no desempenho, pois ignoram o conjunto de dados.
No entanto, o Caso 3 pode melhorar muito os tempos de execução. Especificamente, se você estiver trabalhando com um grande conjunto de dados e tiver algum conhecimento heurístico sobre se A é mais provável que seja maior do que o MaxBound ou menor do que o MinBound, você pode melhorar os tempos de execução visivelmente usando o Caso 3 e ordenando as comparações adequadamente.
Um caso de uso que tenho é consultar um grande conjunto de dados históricos com datas não indexadas para registros dentro de um intervalo específico. Ao escrever a consulta, terei uma boa ideia se existem ou não mais dados ANTES do intervalo especificado ou DEPOIS do intervalo especificado e posso ordenar minhas comparações de acordo. Eu tive o tempo de execução reduzido pela metade, dependendo do tamanho do conjunto de dados, da complexidade da consulta e da quantidade de registros filtrados pela primeira comparação.
fonte
A
é maior do que ambos os limites, verifique se oA
é maior do que oMaxBound
. Sua postagem precisa de alguns ajustes.Neste cenário
col BETWEEN ... AND ...
ecol <= ... and col >= ...
são equivalentes.O SQL Standard define também o predicado T461 Symmetric BETWEEN :
BETWEEN
requer que os valores sejam classificados. Por exemplo:Por outro lado:
Funciona exatamente como o normal,
BETWEEN
mas após classificar os valores de comparação.db <> demonstração de violino
fonte