En este video, le mostraremos cómo usar el operador SQL ENTRE; le mostraremos por qué desea usar el operador ENTRE y cómo evitar errores al usarlo con el tipo de FECHA y HORA.
El operador ENTRE es equivalente al uso y combinación de operadores de comparación >= y <=, pero hace una comparación de rango más compacta. Una vez que haya leído este artículo, le recomendaría ver nuestro próximo Minuto esencial de SQL para continuar aprendiendo más sobre SQL Server.
Una vez que haya visto el video, consulte el código de ejemplo a continuación. También he incluido una transcripción para que la uses.
¡Este es un minuto SQL en el operador ENTRE!
Bienvenido a otro Minuto SQL Esencial. En este episodio, vamos a aprender a usar el operador BETWEEN para comparar un rango de valores en consultas de SQL server.
El operador ENTRE se utiliza para comparar un rango de valores. Aquí hay un ejemplo en el que lo uso para comparar un rango de valores que son mayores o iguales a 12 y menores o iguales a 28. Cuando uso el operador ENTRE, es inclusivo.
Incluirá los números que estamos comparando entre. La forma común para usar BETWEEN en la cláusula WHERE es especificar el campo, por lo que en este caso es «IsoNumericCode», ese es el campo. Luego los operadores ENTRE; estamos diciendo que queremos que el «IsoNumericCode» esté ENTRE y luego el rango. Así que queremos que sea entre 12 y 28.
Es posible que se pregunte cómo se vería esto a la antigua usanza usando mayor que e igual a y menor que e igual a. Así es como se vería. Si fuéramos a hacer lo mismo con mayor e igual a y menor que e igual a, tendríamos donde IsoNumericCode >=12 Y IsoNumericCode <= 28.
Bien, así que vamos a ver cómo se ve esto en SQL server. Tengo nuestra consulta cargada en SQL Server. Pueden ver aquí que vamos a buscar el código isonumérico ENTRE 12 y 28, está en la misma línea, es típicamente como se escribiría.
SELECT CountryID ,CountryName ,IsoAlpha3Code FROM Application.Countries WHERE IsoNumericCode BETWEEN 12 and 28
Déjame ejecutar eso, y traer esto un poco aquí. Puede ver que el rango de valores que regresan es de 12 a 28. Si aumentara esto, digamos, a 100, esperaría ver más filas regresar. Pueden ver que van hasta 100.
Ahora, quiero advertirle que el orden sí importa. Si lo hice ENTRE 100 y 12, no obtendré resultados.
Porque, si lo piensas, lo que está diciendo es que quiero que los códigos numéricos estén entre want Quiero que sean mayores o iguales a 100 y menores o iguales a 12. No hay nada entre eso. Así que es culpa de que no vuelva nada. Así que el orden importa, y es importante que lo tengas para que usando el operador ENTRE, el número más bajo sea el primero. Muy bien, volvamos a 12 y 28.
Otra cosa que puedo hacer es usar NO operador con ENTRE. Así que si digo «NO ENTRE 12 y 28» lo que realmente estoy diciendo es que traigamos de vuelta todas las filas de la tabla de países que no tienen un código numérico que sea mayor o igual a 12 y menor o igual a 28.
SELECT CountryID ,CountryName ,IsoAlpha3Code FROM Application.Countries WHERE IsoNumericCode NOT BETWEEN 12 and 28
Así que, esencialmente, estos cuatro filas se desprendían de ese resultado. Corramos esto. Pueden ver que ahora tengo 186 filas.
Si acabo de hacer la consulta directamente sin restricciones, verás que obtengo 190 filas de vuelta. Esto sirve para mostrarles que esas cuatro filas estaban siendo talladas. De hecho, si quieres hacer otra prueba, podría decir O código isonumérico ENTRE 12 y 28 y esto devolvería todo.
SELECT CountryID ,CountryName ,IsoAlpha3Code FROM Application.Countries WHERE IsoNumericCode NOT BETWEEN 12 and 28 OR IsoNumericCode BETWEEN 12 and 28
Esto devuelve 190 filas. En realidad, esto es un poco absurdo en el sentido de que está trayendo de vuelta todas las filas.
Todos nuestros ejemplos hasta ahora han estado trabajando con el entero. Pero ENTRE trabajos con muchos otros tipos de datos. También podríamos usarlo para tipos de datos de caracteres (VARCHAR), y funcionaría de la misma manera siempre y cuando tengamos las órdenes de intercalación establecidas, todo funciona bien.
Un tipo de datos que creo que debes tener cuidado es el tipo de datos» DateTime».
Porque en el tipo de datos DateTime, verás que hay un componente de hora en la fecha, y si solo hacemos un intervalo entre usar solo el día y no la hora, la fecha y la hora se predeterminarán a medianoche. Realmente no está obteniendo todos los resultados que crees que obtendría. Creo que la mejor manera de hacer esto es mostrarte lo que quiero decir.
DECLARE @myTable TABLE(Name varchar(40), ModifyDate DateTime)INSERT INTO @myTable (Name, ModifyDate) VALUES ('Tom', '2017-02-01');INSERT INTO @myTable (Name, ModifyDate) VALUES ('Tom', '2017-02-01 08:23:42');INSERT INTO @myTable (Name, ModifyDate) VALUES ('Tom', '2017-02-01 14:04:02');INSERT INTO @myTable (Name, ModifyDate) VALUES ('Tom', '2017-02-03');INSERT INTO @myTable (Name, ModifyDate) VALUES ('Tom', '2017-02-03 22:32:43');
Voy a traer un ejemplo donde vamos a declarar una tabla, y en esta tabla vamos a extraer las fechas del 1 al 3 de febrero. Cuando ejecute esto, verás que tengo cinco filas de vuelta.
Observe cómo hay tiempos en estos, ¿verdad? Si no especifico una hora en una fecha, vuelve con una fecha que comienza a medianoche. Hasta ahora, todo bien.
La gran pregunta sería entonces, ¿qué va a suceder en otra consulta aquí, si devuelvo «ModifyDate» ENTRE el 1 y el 3?
Si lo digo en inglés, esperaría que los cinco regresaran. Pero voy a decir ahora mismo que no todos los cinco van a volver, porque este de aquí que tiene la 3ª, cuando se convierte a la fecha y hora, en realidad tendrá una hora de medianoche. Así que va a caer la 5ª fila. Déjame mostrarte a qué me refiero.
SELECT Name, ModifyDateFROM @myTableWHERE ModifyDate BETWEEN '2017-02-01' AND '2017-02-03'ORDER BY ModifyDate
Como puedes ver, ahora básicamente está trayendo de vuelta solo cuatro filas porque estamos buscando, en esencia, fechas y horas que están entre la medianoche del 1 y aproximadamente la medianoche del 3.
Una forma de evitar esto es poner la hora justo antes de la medianoche. Así que sólo para go voy a ir a los segundos aquí. Así que ahora, cuando corro esto, verás que obtengo cinco filas porque va a «11:59:59» segundos.
SELECT Name, ModifyDateFROM @myTableWHERE ModifyDate BETWEEN '2017-02-01' AND '2017-02-03 23:59:59'ORDER BY ModifyDate
No estoy contando los cientos de segundos y así sucesivamente. Para ser honesto, siento que eso es un poco desordenado. Siento que si realmente quieres usar ENTRE fechas en este caso, y querías obtener todas las fechas posibles con su tiempo desde la 3a, la mejor manera de hacerlo es usar la 4a.
SELECCIONE Nombre, ModifyDate
DE @MyTable
DONDE ModifyDate ENTRE ‘2017-02-01 ‘ Y’2017-02-04’
ORDENAR POR ModifyDate
En este caso, BETWEEN con DateTime no utiliza necesariamente el mismo comportamiento que pensaríamos que tendría con enteros, porque aunque es inclusivo, esto va a ir a medianoche, que es solo ese nanosegundo después del 3er. Se ve raro. Cuando ejecute esto, verás que saca esa fecha de la última parte de la tercera.
Así que eso es un gotcha con BETWEEN y DateTime. Así que sé que mucha gente evita entre fechas y hora, y solo usarán más que y menos que.
Por lo que plantea la pregunta: ¿por qué usarías ENTRE?
Creo que hay dos razones por las que querrías usar BETWEEN. La primera es la legibilidad. El segundo es el mantenimiento.
Para la legibilidad, lo que quiero decir es que si tuviera que decir que «ModifyDate» es mayor que e igual a la 1ª, y «ModifyDate» es menor que igual a la 4ª, en una consulta muy larga esto puede ser difícil de leer porque hay muchas expresiones para comenzar a analizar, y la lógica booleana puede interponerse en mi camino. En ese sentido, ENTRE podría parecer un poco más natural de leer. A riesgo de malentender lo que realmente está haciendo, como hemos explicado con DateTime.
También, desde un punto de vista de mantenimiento, si quiero entrar y necesito cambiar como «ModifyDate» a, sé que puedo entrar aquí y tengo que cambiarlo en dos lugares. Tendría que cambiar la primera parte del término y la segunda parte, hipotéticamente. Donde si solo estoy usando ENTRE, solo necesito cambiarlo en un lugar.
Si desea conocer mi opinión sobre si usaría ENTRE o más que o menos que, yo personalmente uso más que o menos que, porque entonces sé qué acción se está tomando realmente. Siento que tengo un poco más de voz explícita en lo que está pasando, y eso me hace sentir mejor. No tengo que preocuparme por: «¿De verdad funciona? ¿Está tomando la fecha antes de medianoche?»Todo ese tipo de suposiciones se va por la ventana. Me gusta trabajar donde no hay suposiciones en las computadoras, solo me hace sentir más feliz. Yo personalmente no uso ENTRE. Pero si te gusta, creo que es genial usarlo. Es compatible con muchos dialectos SQL diferentes, y yo digo que adelante. Gracias de nuevo, que tengas un buen día.