¿El "entre" de MS SQL Server incluye los límites del rango?
por ejemplo puede
SELECT foo
FROM bar
WHERE foo BETWEEN 5 AND 10
¿Selecciona 5 y 10 o están excluidos del rango?
El operador ENTRE es inclusivo.
De libros en línea:
BETWEEN devuelve VERDADERO si el valor de test_expression es mayor o igual que el valor de start_expression y menor o igual que el valor de end_expression.
Advertencia de fecha y hora
NB: Con DateTimes hay que tener cuidado; si sólo se da una fecha se toma el valor a partir de la medianoche de ese día; Para evitar perder horas dentro de su fecha de finalización o repetir la captura de los datos del día siguiente a medianoche en múltiples rangos, su fecha de finalización debe ser 3 milisegundos antes de la medianoche del día siguiente a su fecha de finalización. 3 milisegundos porque si es menor, el valor se redondeará a la medianoche del día siguiente.
por ejemplo, para obtener todos los valores en junio de 2016, deberá ejecutar:
where myDateTime between '20160601' and DATEADD(millisecond, -3, '20160701')
es decir
where myDateTime between '20160601 00:00:00.000' and '20160630 23:59:59.997'
datetime2 y datetimeoffset
Restar 3 ms de una fecha lo dejará vulnerable a que falten filas en la ventana de 3 ms. La solución correcta es también la más sencilla:
where myDateTime >= '20160601' AND myDateTime < '20160701'
Sí, pero tenga cuidado al utilizar Between para fechas.
BETWEEN '20090101' AND '20090131'
en realidad se interpreta como las 12 a. m., o
BETWEEN '20090101 00:00:00' AND '20090131 00:00:00'
por lo que se perderá todo lo que ocurrió durante el día 31 de enero. En este caso, tendrás que utilizar:
myDate >= '20090101 00:00:00' AND myDate < '20090201 00:00:00' --CORRECT!
o
BETWEEN '20090101 00:00:00' AND '20090131 23:59:59' --WRONG! (see update!)
ACTUALIZACIÓN : ¡Es completamente posible crear registros en el último segundo del día, con una fecha y hora tan tardía como 20090101 23:59:59.997
!!
Por esta razón, BETWEEN (firstday) AND (lastday 23:59:59)
no se recomienda el enfoque.
Utilice el myDate >= (firstday) AND myDate < (Lastday+1)
enfoque en su lugar.
Buen artículo sobre este tema aquí .
Ejemplo del mundo real de SQL Server 2008.
Datos fuente:
ID Start
1 2010-04-30 00:00:01.000
2 2010-04-02 00:00:00.000
3 2010-05-01 00:00:00.000
4 2010-07-31 00:00:00.000
Consulta:
SELECT
*
FROM
tbl
WHERE
Start BETWEEN '2010-04-01 00:00:00' AND '2010-05-01 00:00:00'
Resultados:
ID Start
1 2010-04-30 00:00:01.000
2 2010-04-02 00:00:00.000