BETWEEN (Transact-SQL)
Especifica um intervalo a ser testado.
Sintaxe
test_expression [ NOT ] BETWEEN begin_expression AND end_expression
Argumentos
test_expression
É a expressão a ser testada no intervalo definido por begin_expressione end_expression. test_expression deve ter o mesmo tipo de dados para begin_expression e end_expression.NOT
Especifica que o resultado do predicado deve ser negado.begin_expression
É qualquer expressão válida. begin_expression deve ter o mesmo tipo de dados que test_expression e end_expression.end_expression
É qualquer expressão válida. end_expression deve ter o mesmo tipo de dados que test_expressione begin_expression.AND
Atua como um espaço reservado que indica que test_expression deve estar dentro do intervalo indicado por begin_expression e end_expression.
Tipos de resultado
Boolean
Valor do resultado
BETWEEN retorna TRUE se o valor de test_expression for maior que ou igual ao valor de begin_expression e menor que ou igual ao valor de end_expression.
NOT BETWEEN retorna TRUE se o valor de test_expression for menor que o valor de begin_expression ou maior que o valor de end_expression.
Comentários
Para especificar um intervalo exclusivo, use os operadores maior que (>) e menor que (<). Se qualquer entrada para o predicado BETWEEN ou NOT BETWEEN for NULL, o resultado será UNKNOWN.
Exemplos
A. Usando BETWEEN
O exemplo a seguir retorna os funcionários do Ciclos da Adventure Works com taxa de pagamento por hora entre 27 e 30.
USE AdventureWorks2008R2;
GO
SELECT e.FirstName, e.LastName, ep.Rate
FROM HumanResources.vEmployee e
JOIN HumanResources.EmployeePayHistory ep
ON e.BusinessEntityID = ep.BusinessEntityID
WHERE ep.Rate BETWEEN 27 AND 30
ORDER BY ep.Rate;
GO
Aqui está o conjunto de resultados.
FirstName LastName Rate
----------- ------------------ ------------------
Paula Barreto de Mattos 27.1394
Karen Berg 27.4038
Ramesh Meyyappan 27.4038
Dan Bacon 27.4038
Janaina Bueno 27.4038
David Bradley 28.7500
Hazem Abolrous 28.8462
Ovidiu Cracium 28.8462
Rob Walters 29.8462
Sheela Word 30.0000
(10 row(s) affected)
B. Usando > e < em vez de BETWEEN
O exemplo a seguir usa os operadores maior que (>) e menor que (<) e, como esses operadores não são inclusivos, retorna nove linhas em vez das dez retornadas no exemplo anterior.
USE AdventureWorks2008R2;
GO
SELECT e.FirstName, e.LastName, ep.Rate
FROM HumanResources.vEmployee e
JOIN HumanResources.EmployeePayHistory ep
ON e.BusinessEntityID = ep.BusinessEntityID
WHERE ep.Rate > 27 AND ep.Rate < 30
ORDER BY ep.Rate;
GO
Aqui está o conjunto de resultados.
FirstName LastName Rate
--------- ------------------- ---------
Paula Barreto de Mattos 27.1394
Janaina Bueno 27.4038
Dan Bacon 27.4038
Ramesh Meyyappan 27.4038
Karen Berg 27.4038
David Bradley 28.7500
Hazem Abolrous 28.8462
Ovidiu Cracium 28.8462
Rob Walters 29.8462
(9 row(s) affected)
C. Usando NOT BETWEEN
O exemplo a seguir localiza todas as linhas fora de um intervalo especificado de 27 a 30.
USE AdventureWorks2008R2;
GO
SELECT e.FirstName, e.LastName, ep.Rate
FROM HumanResources.vEmployee e
JOIN HumanResources.EmployeePayHistory ep
ON e.BusinessEntityID = ep.BusinessEntityID
WHERE ep.Rate NOT BETWEEN 27 AND 30
ORDER BY ep.Rate;
GO
D. Usando BETWEEN com valores de data e hora
O exemplo a seguir recupera as linhas nas quais os valores datetime estão entre '19971212' e '19980105', inclusive.
USE AdventureWorks2008R2;
GO
SELECT BusinessEntityID, RateChangeDate
FROM HumanResources.EmployeePayHistory
WHERE RateChangeDate BETWEEN '20011212' AND '20020105'
Aqui está o conjunto de resultados.
BusinessEntityID RateChangeDate
----------- -----------------------
3 2001-12-12 00:00:00.000
4 2002-01-05 00:00:00.000
A consulta recupera as linhas esperadas porque os valores de data na consulta e os valores datetime armazenados na coluna RateChangeDate foram especificados sem a parte da hora da data. Quando a parte de hora não é especificada, o padrão é 12:00. Observe que uma linha contendo uma parte da hora após as 12:00 em 1998-0105 não deve ser retornada por essa consulta porque está fora do intervalo.