BETWEEN (Transact-SQL)
Especifica un intervalo que se va a probar.
Sintaxis
test_expression [ NOT ] BETWEEN begin_expression AND end_expression
Argumentos
test_expression
Es la expresión que se va a probar en el intervalo definido mediante begin_expressiony end_expression. test_expression debe ser del mismo tipo de datos que begin_expression y end_expression.NOT
Especifica que se niega el resultado del predicado.begin_expression
Es cualquier expresión válida. begin_expression debe ser del mismo tipo de datos que test_expression y end_expression.end_expression
Es cualquier expresión válida. end_expression debe ser del mismo tipo de datos que test_expressiony begin_expression.AND
Actúa como un marcador de posición que indica que test_expression debe estar dentro del intervalo indicado por begin_expression y end_expression.
Tipos de resultado
Boolean
Valor del resultado
BETWEEN devuelve TRUE si el valor de test_expression es mayor o igual que el valor de begin_expression y menor o igual que el valor de end_expression.
NOT BETWEEN devuelve TRUE si el valor de test_expression es menor que el valor de begin_expression y mayor que el valor de end_expression.
Notas
Para especificar un intervalo exclusivo, utilice los operadores mayor que (>) y menor que (<). Si alguna entrada del predicado BETWEEN o NOT BETWEEN es NULL, el resultado es UNKNOWN.
Ejemplos
A. Utilizar BETWEEN
En el siguiente ejemplo se devuelven los empleados de Adventure Works Cycles cuya tarifa por hora se encuentra entre 27 y 30.
USE AdventureWorks;
GO
SELECT e.FirstName, e.LastName, ep.Rate
FROM HumanResources.vEmployee e
JOIN HumanResources.EmployeePayHistory ep
ON e.EmployeeID = ep.EmployeeID
WHERE ep.Rate BETWEEN 27 AND 30
ORDER BY ep.Rate;
GO
Éste es el 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
Sheela Word 30.0000
(10 row(s) affected)
B. Utilizar > y < en lugar de BETWEEN
En el siguiente ejemplo se utilizan los operadores mayor que (>) y menor que (<) y, puesto que dichos operadores no son inclusivos, se devuelven nueve filas en lugar de las diez devueltas en el ejemplo anterior.
USE AdventureWorks;
GO
SELECT e.FirstName, e.LastName, ep.Rate
FROM HumanResources.vEmployee e
JOIN HumanResources.EmployeePayHistory ep
ON e.EmployeeID = ep.EmployeeID
WHERE ep.Rate > 27 AND ep.Rate < 30
ORDER BY ep.Rate;
GO
Éste es el 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. Utilizar NOT BETWEEN
En el siguiente ejemplo se buscan todas las filas que no están incluidas en un intervalo especificado de 27 a 30.
USE AdventureWorks;
GO
SELECT e.FirstName, e.LastName, ep.Rate
FROM HumanResources.vEmployee e
JOIN HumanResources.EmployeePayHistory ep
ON e.EmployeeID = ep.EmployeeID
WHERE ep.Rate NOT BETWEEN 27 AND 30
ORDER BY ep.Rate;
GO
D. Utilizar BETWEEN con valores datetime
En el siguiente ejemplo se recuperan filas en las que los valores datetime están entre '19971212' y '19980105', ambos incluidos.
USE AdventureWorks
GO
SELECT EmployeeID, RateChangeDate
FROM HumanResources.EmployeePayHistory
WHERE RateChangeDate BETWEEN '19971212' AND '19980105'
Éste es el conjunto de resultados.
EmployeeID RateChangeDate
----------- -----------------------
3 1997-12-12 00:00:00.000
4 1998-01-05 00:00:00.000
La consulta recupera las filas previstas porque los valores de fecha de la consulta y los valores de datetime almacenados en la columna RateChangeDate se han especificado sin la parte de hora de la fecha. Si no se especifica la parte de hora, toma el valor predeterminado 12:00 a.m. Tenga en cuenta que esta consulta no devolverá una fila que contenga una parte de hora posterior a 12:00 a.m. en 1998-0105, ya que está fuera del intervalo.