代码之家  ›  专栏  ›  技术社区  ›  Rick Rat

简单距离查询不起作用

  •  2
  • Rick Rat  · 技术社区  · 14 年前

    根据邮政编码数据库公司的指示,我的邮政编码表中的经纬度定义为十进制(9,6)。

    我把一个lat/lon输入到我的c#程序中的一个函数中,它给了我一个lat/lon边界,以便从数据库中获取lat/lon列表(半径距离)

    sql代码不适用于经度。

    从USZipCode WHERE(纬度在34.7600283409472和37.6513716590528之间)选择TOP(10)* 和(经度在-76.383333和-76.818238之间)

    但如果我跳过经度,那么它就可以工作,或者至少返回记录,即使它们是错误的。

    我唯一能想到的是,既然经度是负的,sql就不能工作了?

    6 回复  |  直到 14 年前
        1
  •  1
  •   David    14 年前

    尝试

    从USZipCode WHERE(纬度在34.7600283409472和37.6513716590528之间)和(经度在-76.818238和-76.383333之间)中选择TOP(10)*

    是因为负数。-76.3是一个大于-76.8的数字,所以你需要把它们颠倒过来。

        2
  •  2
  •   Brad    14 年前

    翻转负上限和负下限:

    -76.818238 is **less than** -76.383333

        3
  •  2
  •   user467105 user467105    14 年前

    -76.818238小于-76.383333。

    尝试:

     AND (Longitude BETWEEN -76.818238 AND -76.383333)
    
        4
  •  2
  •   Amy B    14 年前

    较低的值需要在中间表达式中位于第一位。。。不是较低的绝对值。

    DECLARE @MyTable TABLE
    (
      ID int PRIMARY KEY
    )
    
    
    DECLARE @i int
    SET @i = -10
    WHILE @i < 11
    BEGIN
      INSERT INTO @MyTable (ID) SELECT @i
      SET @i = @i + 1
    END
    
    SELECT * FROM @MyTable
    WHERE ID between 3 AND 6
    
      -- no records because there is no value which is greater than -3 and less than -6
    SELECT * FROM @MyTable
    WHERE ID between -3 AND -6
    
    SELECT * FROM @MyTable
    WHERE ID between -6 AND -3
    
    SELECT * FROM @MyTable
    WHERE ID between -3 AND 3
    

    有趣的是,Sql Server的查询优化器在第二个查询中检测到错误的范围,甚至不在@MyTable上执行IO。

        5
  •  0
  •   remi bourgarel    14 年前

    如果你想用半径来计算,那就用这个函数

        CREATE FUNCTION [dbo].[getDistance]
    (
    @lat1 float,
    @lon1 float,
    @lat2 float,
    @lon2 float
    )
    RETURNS float
    AS
    BEGIN
        -- Declare the return variable here
        DECLARE @result float
    
        -- Add the T-SQL statements to compute the return value here
        SET @result = (SQRT((69.1*(@lat2-@lat1)) * (69.1*(@lat2-@lat1)) + (53.0*(@lon2 - @lon1))*(53.0*(@lon2 - @lon1)))/0.621369949495) 
    
        -- Return the result of the function
        RETURN @result
    
    END
    

    像这样

    SELECT * FROM myTable
    WHERE dbo.getDistance(latitue,longitude,@lat,@long) <= @radius
    
        6
  •  0
  •   Sachin Shanbhag    14 年前

    SELECT TOP(10) * FROM USZipCode 
    WHERE (Longitude BETWEEN -76.818238 AND -76.383333)
    

    我猜您没有指定经度范围内的任何数据 同时-76.818238小于-76.383333