Sql 简单距离查询不起作用

Sql 简单距离查询不起作用,sql,sql-server-2008,Sql,Sql Server 2008,根据邮政编码数据库公司的指示,我的邮政编码表中的纬度和经度定义为小数点9,6 我将一个lat/lon输入到我的c程序中的一个函数,它在边界中为我提供lat/lon,以便从数据库半径距离中获取lat/lon列表 sql代码不适用于经度 从USZipCode中选择TOP10*,其中纬度介于34.7600283409472和37.6513716590528之间 经度介于-76.383333和-76.818238之间 但是如果我跳过经度,它就会工作,或者至少返回记录,即使它们是错误的 从USZipCod

根据邮政编码数据库公司的指示,我的邮政编码表中的纬度和经度定义为小数点9,6


我将一个lat/lon输入到我的c程序中的一个函数,它在边界中为我提供lat/lon,以便从数据库半径距离中获取lat/lon列表

sql代码不适用于经度

从USZipCode中选择TOP10*,其中纬度介于34.7600283409472和37.6513716590528之间 经度介于-76.383333和-76.818238之间

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

从USZipCode中选择TOP10*,其中纬度介于34.7600283409472和37.6513716590528之间

我唯一能想到的事;是因为经度为负,所以sql不工作吗

这是SQL SERVER 2008 R2,我还尝试了Lat>x和Lat>y等功能。

试试看

从USZipCode中选择TOP10*,其中纬度介于34.7600283409472和37.6513716590528之间,经度介于-76.818238和-76.383333之间


这是因为负数-76.3比-76.8大,因此您需要反转它们。

翻转负数上限和下限:


-76.818238**小于**-76.383333

如果要使用半径计算,则使用此函数

    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

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

SELECT TOP(10) * FROM USZipCode 
WHERE (Longitude BETWEEN -76.818238 AND -76.383333)
我猜您没有指定经度范围内的任何数据
而且-76.818238小于-76.383333

-76.818238小于-76.383333

尝试:


较低的值必须位于表达式之间的第一个。。。而不是较低的绝对值

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。

Off-topic。很酷,但绝对不是OP所要求的。我把一个lat/lon输入到我的c程序中的一个函数,它给了我lat/lon的边界,以便从数据库半径距离获取lat/lon的列表,他所做的是在2个值之间无意义地取lat/lon。当然,他最后得到的是一个正方形区域中的所有点。2分-1分。他的查询条件是可搜索的。2.他可以在他的c应用程序中通过计算距离进一步过滤结果。@David,如果他想使用索引,他可以执行子查询以进行第一次过滤,然后执行第二次查询以过滤距离。我在dev机器上对一个有300000行的表进行了查询,结果在不到一秒钟的时间内显示出来。我对c语言中的数据过滤过敏。我并没有离题。是的,我把它传递给一个程序,这个程序给我一个给定距离的lat/lon界限,以英里或公里为单位。e、 它返回2 lat,2 lon。我有数据,就像第一个答案所说的,数字需要颠倒,然后查询就成功了。@Rick-是的,我也这么认为。在我的回答中也提到了这一点;
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