简单距离查询无效

时间:2010-10-15 14:42:49

标签: sql sql-server-2008

根据邮政编码公司的说明,我的邮政编码表中的纬度和经度被定义为十进制(9,6)。

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

sql代码不适用于经度。

SELECT TOP(10)* from USZipCode WHERE(Latitude BETWEEN 34.7600283409472 AND 37.6513716590528) AND(经度BETWEEN -76.383333和-76.818238)

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

SELECT TOP(10)* from USZipCode WHERE(Latitude BETWEEN 34.7600283409472 AND 37.6513716590528)

我唯一能想到的;是因为经度是负的,sql不工作?

这是SQL SERVER 2008 R2,我也尝试过Lat> x和Lat>等等。

6 个答案:

答案 0 :(得分:2)

翻转您的上限和下限:

-76.818238 is **less than** -76.383333

答案 1 :(得分:2)

-76.818238小于-76.383333。

尝试:

 AND (Longitude BETWEEN -76.818238 AND -76.383333)

答案 2 :(得分:2)

BETWEEN表达式中较低的值必须是第一个...不是较低的绝对值。

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上执行I​​O。

答案 3 :(得分:1)

SELECT TOP(10)* from USZipCode WHERE(Latitude BETWEEN 34.7600283409472 AND 37.6513716590528)AND(经度BETWEEN -76.818238 AND -76.383333)

这是因为负数。 -76.3是一个大于-76.8的数字,所以你需要反转它们。

答案 4 :(得分:0)

如果你想用半径计算它更复杂,使用这个函数

    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

答案 5 :(得分:0)

运行此查询,看看您是否有此范围内的任何记录 -

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

我的猜测是你没有指定经度范围内的任何数据 并且-76.818238小于-76.383333