2009-04-14 10 views

Respuesta

220

El operador BETWEEN es inclusivo.

De los libros en pantalla:

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

DateTime Advertencia

NB: Con DateTime usted tiene que tener cuidado; si solo se da una fecha, el valor se toma a partir de la medianoche de ese día; para evitar tiempos perdidos dentro de su fecha de finalización o repetir la captura de los datos del día siguiente a la medianoche en múltiples rangos, su fecha de finalización debe ser de 3 milisegundos antes de la medianoche del día posterior a su fecha actual. 3 milisegundos porque cualquier valor menor que este y el valor se redondeará hasta la medianoche del día siguiente.

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

where myDateTime between '2016-06-01' and dateadd(millisecond, -3, '2016-07-01')

es decir

where myDateTime between '2016-06-01 00:00:00.000' and '2016-07-01 23:59:59.997'

+5

Cuando se utiliza para filtrar ENTRE DateTime entre dos fechas, también se puede emitir el DateTime a una fecha, por ejemplo: cuando CONVERT (FECHA, MiFecha) ENTRE '09/01/2017' y '30/09/2017 'Este enfoque hace que el elemento de tiempo de DateTime sea irrelevante – Pete

10

BETWEEN (Transact-SQL)

Especifica un (n) (inclusive) rango para 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 del mismo tipo de datos que begin_expression y end_expression.

NOT 

Especifica que el resultado del predicado debe ser negado.

begin_expression 

Es cualquier expresión válida. begin_expression debe ser el mismo tipo de datos como test_expression y end_expression.

end_expression 

Es cualquier expresión válida.end_expression debe ser el mismo tipo de datos como test_expression y begin_expression.

AND 

Actúa como un marcador de posición que indica test_expression debería ser 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 alguna entrada al predicado BETWEEN o NOT BETWEEN es NULL, el resultado es UNKNOWN.

Valor Resultado

ENTRE devuelve verdadero si el valor de test_expression es mayor o igual a el 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 el valor de begin_expression o mayor que el valor de Expresion_Fin.

237

Sí, pero tenga cuidado al usar entre fechas.

BETWEEN '01/01/2009' AND '01/31/2009' 

es realmente interpreta como 12 a.m., o

BETWEEN '01/01/2009 00:00:00' AND '01/31/2009 00:00:00' 

así se perderá nada de lo que ocurrió durante el día, 31 de Ene. En este caso, tendrá que utilizar:

myDate >= '01/01/2009 00:00:00' AND myDate < '02/01/2009 00:00:00' --CORRECT! 

o

BETWEEN '01/01/2009 00:00:00' AND '01/31/2009 23:59:59' --WRONG! (see update!) 

ACTUALIZACIÓN: Es perfectamente posible tener registros creados dentro de ese último segundo del día, con una fecha y hora tan tardía como 01/01/2009 23:59:59.997 !!

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

En su lugar, utilice el método myDate >= (firstday) AND myDate < (Lastday+1).

Bueno article on this issue here.

+1

Problemas similares con cadenas también' WHERE col ENTRE 'a' Y 'z' 'excluirá la mayoría de las filas z, por ejemplo. –

+7

Este punto es correcto, por supuesto; pero no debe sorprender si trabajas con fechas y horas. Es análogo a señalar que 'ENTRE 5 Y 10' no incluye' 10.2' ... –

+4

'CAST' funcionaría' datetime' como 'DATE':' CAST (DATE_TIME_COL AS DATE) ENTRE '01/01/2009 'Y '01/31/2009''. – craig

16

ejemplo del mundo real de SQL Server 2008.

alt text

+0

+1 muchas gracias ... –

+0

No recibí su respuesta, para ser honesto. Tal vez mi proveedor de internet haya ocultado tu captura de pantalla si has publicado una. –

+0

@Anar, el enlace directo a la imagen es http://imgur.com/sTKRO.png. –

12

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

myDate >= '01/01/2009 00:00:00' AND myDate < DATEADD(day,1,'01/01/2009 00:00:00') 
3

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 solamente intervalo de fechas.

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

Tenga en cuenta que eso no es [sargable] (http://en.wikipedia.org/wiki/Sargable). –

+0

Esto funciona mejor que agregar +1 a la fecha de finalización. Estoy de acuerdo con Andrew Morton: si no es sargable, puede mejorar el rendimiento para cambiar el tipo de datos de columna o agregar una segunda columna solo con fechas precalculadas. – Volkirith

-2

Siempre he usado esto:

DONDE myDate ENTRE startDate Y (endDate + 1)

0

Hace 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 
Cuestiones relacionadas