2009-10-27 9 views
78

En SQL Server 2000 y 2005:SQL: ENTRE vs <= and > =

  • ¿cuál es la diferencia entre estos dos WHERE cláusulas?
  • ¿Cuál debería usar en qué escenarios?

Consulta 1:

SELECT EventId, EventName 
FROM EventMaster 
WHERE EventDate BETWEEN '10/15/2009' AND '10/18/2009' 

Consulta 2:

SELECT EventId, EventName 
FROM EventMaster 
WHERE EventDate >='10/15/2009' 
    AND EventDate <='10/18/2009' 

(Editar: el segundo EVENTDATE fue originalmente falta, por lo que la consulta era sintácticamente mal)

+1

Esto es casi un duplicado con http://stackoverflow.com/questions/1572840/sql-between-v1-and-v2 – mjv

+4

no realmente, el manejo de datetime es ligeramente diferente, más eso fue para SQL server 2008, y no hay forma de que Shyju pueda estar seguro sin pedir que la respuesta sea la misma para las versiones anteriores. – Irfy

Respuesta

82

Son idénticos: BETWEEN es una abreviatura de la sintaxis más larga en la pregunta.

Utilice una sintaxis más larga alternativa donde BETWEEN no funciona, p.

Select EventId,EventName from EventMaster 
where EventDate >= '10/15/2009' and EventDate < '10/18/2009' 

(Nota < en lugar de <= en segunda condición.)

+14

Tal vez deberías destacar que la segunda condición es '<'.Me llevó algo de tiempo detectar la diferencia. – zendar

+16

Debo agregar que recomiendo encarecidamente nunca utilizar BETWEEN a menos que esté tratando con el tipo de datos DATE o haya garantizado que sus valores de fecha y hora nunca tendrán un componente de tiempo. Ser consecuente con esto hará que sea menos probable que use BETWEEN por error en lugar de> = y <, y obtenga algunos datos en la consulta que no tenía intención de hacer, o piense que estaba recibiendo un día adicional de datos cuando no está ... –

+1

¿Habría un segundo paso de compilación ya que BETWEEN se convierte a condicionales? Entiendo que esto es un poco pedante, pero ¿habría una carga adicional? –

4

Por lo general, no hay ninguna diferencia - la palabra clave BETWEEN no es compatible con todas las plataformas de RDBMS, pero si lo es, las dos consultas debe ser idéntico.

Dado que son idénticos, no existe realmente ninguna distinción en términos de velocidad o cualquier otra cosa: utilice el que le parezca más natural.

3

Creo que la única diferencia es la cantidad de azúcar sintáctica en cada consulta. BETWEEN es solo una manera elegante de decir exactamente lo mismo que la segunda consulta.

Puede haber alguna diferencia específica de RDBMS de la que no tengo conocimiento, pero realmente no lo creo.

28

Son lo mismo.

Una cosa a tener cuidado de, es si está usando esto en contra de una fecha y hora, el partido por la fecha de finalización será el inicio de la jornada:

<= 20/10/2009 

no es lo mismo que:

<= 20/10/2009 23:59:59 

(que haría partido contra <= 20/10/2009 00:00:00.000)

+0

Puede usar simplemente entre '2009-10-20' y '2009-10-21' en ese caso para capturar el día –

+3

@DavidAndreiNed que también coincidiría con '2009-10-21 00: 00: 00.000' - probablemente no sea lo que quieres. –

2

Lógicamente hay ninguna diferencia en absoluto. En cuanto a rendimiento, hay -típicamente, en la mayoría de los DBMS- ninguna diferencia.

4

Según lo mencionado por @marc_s, @Cloud, et al. son básicamente lo mismo para un rango cerrado.

Pero cualquier valores de tiempo fraccionales pueden causar problemas con una gama cerrada (mayor o igual y menos o igual), frente a una gama media-abierta (mayor o igual y menos-que) con un valor final después de el último instante posible.

Así que para evitar que la consulta debe ser reescrita como:

SELECT EventId, EventName 
    FROM EventMaster 
WHERE (EventDate >= '2009-10-15' AND 
     EventDate < '2009-10-19') /* <<<== 19th, not 18th */ 

Desde BETWEEN no funciona para intervalos semiabiertos Siempre tomo una mirada a cualquier consulta de fecha/hora que lo utiliza, ya es probablemente un error.

2

Consulte este excellent blog post de Aaron Bertrand sobre por qué debe cambiar el formato de cadena y cómo se manejan los valores de límite en las consultas de rango de fechas.

2

Tengo una ligera preferencia por BETWEEN porque deja en claro instantáneamente al lector que está revisando un campo para un rango. Esto es especialmente cierto si tiene nombres de campo similares en su tabla.

Si, por ejemplo, la mesa tiene tanto un transactiondate y una transitiondate, si leo

transactiondate between ... 

sé inmediatamente que los dos extremos de la prueba están en contra de éste campo.

Si leo

transactiondate>='2009-04-17' and transactiondate<='2009-04-22' 

tengo que tomar un momento extra para asegurarse de que los dos campos son los mismos.

Además, como una consulta se edita con el tiempo, un programador descuidado podría separar los dos campos. He visto un montón de consultas que decir algo como

where transactiondate>='2009-04-17' 
    and salestype='A' 
    and customernumber=customer.idnumber 
    and transactiondate<='2009-04-22' 

Si tratan esto con un BETWEEN, por supuesto, será un error de sintaxis y rápidamente fija.

11

Aunque BETWEEN es fácil de leer y mantener, raramente recomiendo su uso porque es un intervalo cerrado y como se mencionó anteriormente, esto puede ser un problema con las fechas, incluso sin componentes de tiempo.

Por ejemplo, cuando se trata de datos mensual que suele ser común para comparar las fechas BETWEEN first AND last, pero en la práctica esto suele ser más fácil de escribir dt >= first AND dt < next-first (que también resuelve el problema a tiempo parcial) - desde la determinación de last por lo general es un paso más de lo determinando next-first (restando un día).

Además, otra cuestión es que los límites inferior y superior deben especificarse en el pedido correcto (es decir, BETWEEN low AND high).

+0

@DavidAndreiNed Incorrecto. No disemine esto – Atys