¿El "entre" de MS SQL Server incluye los límites del rango?

Resuelto Lea Verou asked hace 15 años • 8 respuestas

por ejemplo puede

SELECT foo
FROM bar
WHERE foo BETWEEN 5 AND 10

¿Selecciona 5 y 10 o están excluidos del rango?

Lea Verou avatar Apr 15 '09 05:04 Lea Verou
Aceptado

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'
DJ. avatar Apr 14 '2009 22:04 DJ.

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í .

BradC avatar Apr 14 '2009 23:04 BradC

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

texto alternativo

Ryan Rodemoyer avatar Jul 30 '2010 19:07 Ryan Rodemoyer