SQL: ENTRE vs < = y>=


En SQL Server 2000 y 2005:

  • ¿cuál es la diferencia entre estas 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: la segunda Eventdate originalmente faltaba, por lo que la consulta era sintácticamente incorrecta)

Author: Oreo, 2009-10-27

9 answers

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

Use una sintaxis alternativa más larga donde BETWEEN no funciona, por ejemplo,

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

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

 91
Author: Tony Andrews,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-11 14:29:29

Son lo mismo.

Una cosa a tener en cuenta, es que si está utilizando esto contra una FECHA y hora, la coincidencia para la fecha final será el comienzo del día:

<= 20/10/2009

No es lo mismo que:

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

(it would match against <= 20/10/2009 00:00:00.000)

 28
Author: Irfy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-27 11:55:14

Aunque BETWEEN es fácil de leer y mantener, rara vez 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 mensuales, a menudo es común comparar 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 (lo que también resuelve el problema de la parte de tiempo), ya que determinar last generalmente es un paso más largo que determinar next-first (restando dia).

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

 11
Author: Cade Roux,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-27 13:24:19

Normalmente, no hay diferencia - la palabra clave BETWEEN no es compatible con todas las plataformas RDBMS, pero si lo es, las dos consultas deben ser idénticas.

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

 4
Author: marc_s,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-27 11:41:18

Como lo mencionan @marc_s, @Cloud, et al. son básicamente lo mismo para un rango cerrado.

Pero cualquier valor de tiempo fraccional puede causar problemas con un rango cerrado (mayor o igual y menos o igual) en lugar de un rango medio abierto (mayor o igual y menos que) con un valor final después de el último instante posible.

Para evitar que la consulta se reescriba como:

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

Dado que BETWEEN no funciona para intervalos medio abiertos siempre echa un vistazo a cualquier consulta de fecha / hora que lo use, ya que probablemente sea un error.

 4
Author: devstuff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-27 11:52:57

Creo que la única diferencia es la cantidad de azúcar sintáctica en cada consulta. ENTRE es solo una forma hábil de decir exactamente lo mismo que la segunda consulta.

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

 3
Author: pyrocumulus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-27 11:41:32

Lógicamente no hay ninguna diferencia. En cuanto al rendimiento, por lo general, en la mayoría de los DBMSE, no hay ninguna diferencia.

 2
Author: mjv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-27 11:42:21

Vea esta excelente entrada de blogde 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
Author: Andy Jones,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:47:19

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

Si, por ejemplo, nuestra tabla tiene tanto un transactiondate y un transitiondate, si leo

transactiondate between ...

Sé inmediatamente que ambos extremos de la prueba están en contra de este campo.

Si leo

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

Tengo que tomarme un momento extra para asegurarme de que los dos campos son igual.

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

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

Si intentan esto con un BETWEEN, por supuesto, será un error de sintaxis y se corregirá rápidamente.

 2
Author: Jay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-28 01:03:10