Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-06-2013
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 304
Poder: 21
salvica Va por buen camino
Uso de BETWEEN

Hola, tengo una tabla con datos, entre los que se encuentran LATITUD y LONGITUD (coordenadas de GoogleMaps) e intento listar aquellos lugares cuyas coordenadas se encuentren en un máximo de 0.6º de un punto central.

Hago la siguiente consulta, y medevuelve resultados (las coordenadas son de Albacete):
Código SQL [-]
SELECT *
FROM lugares
WHERE ( latitud < ( 38.953619 + 0.6 ))
  AND ( latitud > ( 38.953619 - 0.6 ))
  AND (longitud > ( - 1.85806 - 0.6 ))
  AND (longitud < ( - 1.85806 + 0.6 ))
Para resumir el código, hago la misma consulta mediante BETWEEN, pero no me devuelve nada:
Código SQL [-]
SELECT *
  FROM lugares
 WHERE ( latitud  BETWEEN ( 38.953619 + 0.6 ) AND ( 38.953619 - 0.6 ) )
     AND ( longitud BETWEEN (  -1.85806 - 0.6 ) AND ( -1.85806 + 0.6 ) )
Según mis notas, la sintaxis es:
Código SQL [-]
SELECT "nombre_columna"
          FROM "nombre_tabla"
          WHERE "nombre_columna" BETWEEN 'valor1' AND 'valor2'
¿Donde estoy metiendo la pata?
Gracias adelantadas
Salvica
Responder Con Cita
  #2  
Antiguo 08-06-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola salvica.

Me parece que debería ser:
Código SQL [-]
SELECT *
FROM LUGARES
WHERE LATITUD - 38.953619 BETWEEN -0.6  AND 0.6
  AND LONGITUD + 1.85806 BETWEEN -0.6 AND 0.6

Pero de este modo me resulta más simple:
Código SQL [-]
SELECT *
FROM LUGARES
WHERE ABS(LATITUD - 38.953619) <= 0.6 
  AND ABS(LONGITUD + 1.85806) <= 0.6

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 08-06-2013 a las 23:43:10.
Responder Con Cita
  #3  
Antiguo 09-06-2013
luisgutierrezb luisgutierrezb is offline
Miembro
 
Registrado: oct 2005
Ubicación: México
Posts: 925
Poder: 19
luisgutierrezb Va por buen camino
CREO que en SQL server, el between solo maneja números enteros, no me crean mucho, cuestión de googlear...
Responder Con Cita
  #4  
Antiguo 09-06-2013
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 304
Poder: 21
salvica Va por buen camino
Hola ecfisa y luisgutierrezb, gracias por contestar

El +0.6 y -06 es lo que hay que sumar a la LATITUD/LONGITUD para componer un cuadrado de aproximadamente 100 kilómetros de lado, con centro en el punto (LATITUD, LONGITUD)

La pregunta viene, porque parece que BETWEEN no responde a las operaciones de suma/resta, mientras que si lo meto a pelo si responde.

Gracias
salvica
Responder Con Cita
  #5  
Antiguo 09-06-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
En una usas ABS y en la otra no, no es exactamente igual
Responder Con Cita
  #6  
Antiguo 10-06-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

En Firebird cree e hice estas pruebas sobre la tabla LUGARES con tres campos NOMBRE, LATITUD y LONGITUD (El primero VARCHAR(20) y los dos restantes DOUBLE PRECISION).

Valores:
Código:
NOMBRE	LATITUD	         LONGITUD     OPERACION
A	38,353619	-2,45806      (-0.6)
B	38,953619	-1,85806      ( = )
C	38,553619	-1,25806      (+0.6)
Y tanto con la función ABS, o mediante BETWEEN obtengo los registros, pero las comparaciónes no pueden ser echas como mencioné en el mensaje anterior debido a los decimales.

En el caso de Firebird 2.5 y con DOUBLE PRECISION tuve que comparar con un mínimo de:
Código SQL [-]
   ...
  WHERE LATITUD - 38.953619 BETWEEN -0.60000000000001 AND 0.60000000000001
    AND LONGITUD +  1.85806 BETWEEN -0.60000000000001 AND 0.60000000000001
O
Código SQL [-]
  ...
  WHERE ABS(LATITUD - 38.953619)  <= 0.60000000000001
    AND ABS(LONGITUD + 1.85806 )  <= 0.60000000000001
Para que mostrara la totalidad de registros que deberían ser incluidos.

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #7  
Antiguo 01-07-2013
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 304
Poder: 21
salvica Va por buen camino
Gracias a todos, al final lo he hecho así:
Código SQL [-]
SELECT *
   FROM lugares
WHERE (latitud   BETWEEN (38.953619-0.65) AND (38.953619+0.65) )
      AND (longitud  BETWEEN (-1.858060-0.9)  AND (-1.858060+0.9) );

Salvica
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 01:20:08.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi