por ejemplo, puede¿El "entre" del servidor MS SQL incluye los límites del rango?
SELECT foo
FROM bar
WHERE foo BETWEEN 5 AND 10
seleccione 5 y 10 o que están excluidos de la gama?
por ejemplo, puede¿El "entre" del servidor MS SQL incluye los límites del rango?
SELECT foo
FROM bar
WHERE foo BETWEEN 5 AND 10
seleccione 5 y 10 o que están excluidos de la gama?
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'
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.
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.
Problemas similares con cadenas también' WHERE col ENTRE 'a' Y 'z' 'excluirá la mayoría de las filas z, por ejemplo. –
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' ... –
'CAST' funcionaría' datetime' como 'DATE':' CAST (DATE_TIME_COL AS DATE) ENTRE '01/01/2009 'Y '01/31/2009''. – craig
ejemplo del mundo real de SQL Server 2008.
+1 muchas gracias ... –
No recibí su respuesta, para ser honesto. Tal vez mi proveedor de internet haya ocultado tu captura de pantalla si has publicado una. –
@Anar, el enlace directo a la imagen es http://imgur.com/sTKRO.png. –
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')
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)
Tenga en cuenta que eso no es [sargable] (http://en.wikipedia.org/wiki/Sargable). –
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
Siempre he usado esto:
DONDE myDate ENTRE startDate Y (endDate + 1)
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
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