Pregunta

Por ejemplo puede

SELECT foo
FROM bar
WHERE foo BETWEEN 5 AND 10

seleccionar 5 y 10 o que están excluidos del alcance?

¿Fue útil?

Solución

El operador BETWEEN es inclusive.

A partir de los libros en pantalla:

  

Entre devuelve verdadero si el valor de   test_expression es mayor que o   igual al valor de begin_expression   y menor o igual al valor de   Expresion_Fin.

Fecha y hora Advertencia

Nota: Con DateTime que tienes que tener cuidado; Si sólo se da una fecha el valor se toma como la media noche de ese día; para evitar tiempos que falte en la fecha de finalización, o la repetición de la captura de los datos del día siguiente a la medianoche en varios rangos, la fecha de finalización debe ser de 3 milisegundos antes de la medianoche del día siguiente a su hasta la fecha. 3 milisegundos porque cualquier menos de esto y el valor se redondea a la medianoche del día siguiente.

por ejemplo. para obtener todos los valores dentro de junio el año 2016 que había necesidad de correr:

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

Al restar 3 ms partir de una fecha dejará vulnerable a las filas de la ventana de 3 ms faltante. La solución correcta es también la más simple:

where myDateTime >= '20160601' AND myDateTime < '20160701'

Otros consejos

Sí, pero tenga cuidado al usar entre las fechas.

BETWEEN '20090101' AND '20090131'

que realmente se interpreta como 12 a.m., o

BETWEEN '20090101 00:00:00' AND '20090131 00:00:00'

así que se pierda nada de lo que ocurrió durante el día, 31 de Ene. En este caso, tendrá 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!)

Actualizar : Es enteramente posible tener registros creados dentro de ese último segundo del día, con una fecha y hora tan tardía como 20090101 23:59:59.997 !!

Por esta razón, no se recomienda el enfoque BETWEEN (firstday) AND (lastday 23:59:59).

Utilice el enfoque myDate >= (firstday) AND myDate < (Lastday+1) lugar.

Buena artículo sobre este tema aquí .

Ejemplo real de SQL Server 2008.

Los 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

text alt

si se golpea esto, y realmente no quiere tratar de manejar la adición de un día en el código, a continuación, dejar que el PP lo hace ..

myDate >= '20090101 00:00:00' AND myDate < DATEADD(day,1,'20090101 00:00:00')

Si no incluye la porción de tiempo: asegúrese de que hace referencia a la medianoche. De lo contrario puede simplemente omitir el tiempo:

myDate >= '20090101' AND myDate < DATEADD(day,1,'20090101')

y no preocuparse por ello.

  

ENTRE (Transact-SQL)

     

Especifica un ( n ) ( inclusive ) Rango de probar.

test_expression [ NOT ] BETWEEN begin_expression AND end_expression
  

Argumentos

test_expression
     

Es la expresión para probar en el rango definido por begin_expression   y Expresion_Fin. test_expression   debe ser el mismo tipo de datos que tanto   begin_expression y Expresion_Fin.

NOT
     

Especifica que el resultado del predicado ser negado.

begin_expression
     

es cualquier expresión válida. begin_expression debe ser el mismo de datos   escriba como tanto test_expression y   Expresion_Fin.

end_expression
     

es cualquier expresión válida. Expresion_Fin debe ser el mismo de datos   escriba como tanto test_expression y   begin_expression.

AND
     

actúa como un marcador de posición que indica test_expression debería haber   dentro del intervalo indicado por   begin_expression y Expresion_Fin.

     

Observaciones

     

Para especificar una gama exclusiva, utilice el   mayor que (>) y menos de   operadores (<). Si cualquier entrada a la   ENTRE NO ENTRE o predicado es   NULL, el resultado es desconocido.

     

Valor del resultado

     

Entre devuelve verdadero si el valor de   test_expression es mayor que o   igual al valor de begin_expression   y menor o igual al valor de   Expresion_Fin.

     

NO ENTRE devuelve verdadero si el valor   de test_expression es menor que la   valor de begin_expression o mayor   que el valor de Expresion_Fin.

Si el tipo de datos de fecha y hora columna es entonces usted puede hacer esto después de eliminar el tiempo de fecha y hora y compara entre rango de fechas solamente.

where cast(getdate() as date) between cast(loginTime as date) and cast(logoutTime as date)

No incluye límites.

declare @startDate date = cast('15-NOV-2016' as date) 
declare @endDate date = cast('30-NOV-2016' as date)
create table #test (c1 date)
insert into #test values(cast('15-NOV-2016' as date))
insert into #test values(cast('20-NOV-2016' as date))
insert into #test values(cast('30-NOV-2016' as date))
select * from #test where c1 between @startDate and @endDate
drop table #test
RESULT    c1
2016-11-15
2016-11-20
2016-11-30


declare @r1 int  = 10
declare @r2 int  = 15
create table #test1 (c1 int)
insert into #test1 values(10)
insert into #test1 values(15)
insert into #test1 values(11)
select * from #test1 where c1 between @r1 and @r2
drop table #test1
RESULT c1
10
11
15

Siempre he usado esto:

donde myDate ENTRE startDate Y (endDate + 1)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top