Простой дистанционный запрос не работает - PullRequest
2 голосов
/ 15 октября 2010

У меня широта и долгота определены как десятичные (9, 6) в моей таблице почтовых индексов в соответствии с инструкциями компании базы данных почтовых индексов.

Я принимаю широту / долготу, чтобы передать функцию в моем c #программа, и она дает мне широта / долгота в границах для получения списка широта / долгота из базы данных (радиус расстояние)

SQL-код не работает с долготой.

ВЫБЕРИТЕ TOP (10) * ИЗ USZipCode WHERE (Широта между 34.7600283409472 и 37.6513716590528) И (Долгота между -76.383333 И -76.818238)

Но если я пропущу долготу, то это сработает, или, по крайней мередаже если они неправильные.

ВЫБРАТЬ ТОП (10) * ИЗ USZipCode WHERE (Широта МЕЖДУ 34.7600283409472 И 37.6513716590528)

Единственное, о чем я могу думать;это так как долгота отрицательна, что sql не работает?

Это SQL SERVER 2008 R2, и я также пробовал Lat> x и Lat> y и т. д.

Ответы [ 6 ]

2 голосов
/ 15 октября 2010

Нижнее значение должно быть первым в выражении 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 обнаруживает неверный диапазон во втором запросеи даже не выполняет IO для @ MyTable.

2 голосов
/ 15 октября 2010

-76,818238 меньше -76,383333.

Попробуйте:

 AND (Longitude BETWEEN -76.818238 AND -76.383333)
2 голосов
/ 15 октября 2010

Переверните верхний и нижний отрицательные пределы:

-76.818238 is **less than** -76.383333

1 голос
/ 15 октября 2010

1001 * попробовать *

ВЫБРАТЬ ТОП (10) * ИЗ USZipCode, ГДЕ (Широта между 34.7600283409472 И 37.6513716590528) И (Долгота между -76.818238 И -76.383333)

Это из-за отрицательных чисел. -76,3 больше, чем -76,8, поэтому вам нужно обратить их вспять.

0 голосов
/ 15 октября 2010

Запустите этот запрос и посмотрите, есть ли у вас какие-либо записи в этом диапазоне -

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

Я предполагаю, что у вас нет данных в указанном диапазоне долготы а также -76,818238 меньше -76,383333

0 голосов
/ 15 октября 2010

Если вы хотите вычислить с радиусом, это более сложно, используйте эту функцию

    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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...