Alcance de SQL a un cuadro delimitador más de la línea de fecha internacional

0

Pregunta

Estoy tratando de alcance mi consulta para seleccionar los lugares que están dentro de un cuadro delimitador de latitud y longitud. En general esto funciona bien, dado el cuadro delimitador, no cruza la línea de fecha internacional.

SELECT *
FROM locations
WHERE latitude BETWEEN ? AND ?
AND longitude BETWEEN ? AND ?

Sin embargo - si mi cuadro delimitador fue a cruzar la línea de fecha internacional - decir longitudinal de los límites de 179.00 a -179.00 a continuación, la consulta no devuelve ningún resultado. Yo no puedo simplemente voltear el orden y el cambio entre -179.00 y 179.00 debido a que en lugar de devolver las cosas fuera de mi cuadro delimitador.

¿Cuál es la sanest mejor manera de determinar la adecuada SQL requerido (como SQL o psuedocode que podría ayudar a obtener la mejor SQL).

1

Mejor respuesta

1

Una cosa que usted podría hacer es usar CASE WHEN las expresiones de la WHERE cláusula para distinguir si la parte inferior de tu longitudinal obligado es más grande que la superior y modificar el comportamiento en consecuencia:

SELECT * 
  FROM locations 
 WHERE lon BETWEEN CASE WHEN @param1 > @param2 THEN -180.0 
                        ELSE @param1 
                   END AND @param2 
    OR lon BETWEEN CASE WHEN @param1 > @param2 THEN @param1 
                        ELSE 181.0 
                   END AND 180.0

Por su ejemplo (longitudinal de los límites de 179.00 a -179.00), esto tendrá el mismo efecto como

SELECT * 
  FROM locations 
 WHERE lon BETWEEN -180.0 AND -179.0
    OR lon BETWEEN 179.0 AND 180.0

mientras que la misma consulta para el invertida ejemplo (longitudinal de los límites de -179.00 a 179.00) evaluará a

SELECT * 
  FROM locations 
 WHERE lon BETWEEN -179.0 AND 179.0
    OR lon BETWEEN 181.0 AND 180.0 -- (always false)

Ver en acción en este db<>violín (SQL Server ejemplo).

2021-11-19 15:43:38

Me gusta a donde va esto, creo que es un buen plan para traducir en algún código que podría generar SQL sin la siempre falsa O cláusula.
Dwight

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................