根据邮政编码公司的说明,我的邮政编码表中的纬度和经度被定义为十进制(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>等等。
答案 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上执行IO。
答案 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