Определение области SQL в ограничивающем поле по строке международной даты

0

Вопрос

Я пытаюсь расширить область своего запроса, чтобы выбрать местоположения, которые находятся в пределах ограничивающего прямоугольника широт/долгот. Как правило, это отлично работает, учитывая, что ограничивающая рамка не пересекает международную линию дат.

SELECT *
FROM locations
WHERE latitude BETWEEN ? AND ?
AND longitude BETWEEN ? AND ?

Однако - если бы моя ограничивающая рамка пересекала международную линию дат - скажем, продольные границы 179.00 Для -179.00 затем запрос не возвращает никаких результатов. Я не могу просто перевернуть заказ и изменить его на между -179.00 и 179.00 потому что это вместо этого вернуло бы вещи за пределы моей ограничивающей рамки.

Каков самый разумный способ наилучшим образом определить необходимый соответствующий SQL (либо в виде SQL, либо в виде psuedocode, который поможет получить лучший SQL).

1

Лучший ответ

1

Единственное, что вы могли бы сделать, это использовать CASE WHEN выражения в WHERE предложение, чтобы определить, больше ли ваша нижняя продольная граница, чем верхняя, и соответствующим образом изменить поведение:

SELECT * 
  FROM locations 
 WHERE lon BETWEEN CASE WHEN @param1 > @param2 THEN -180.0 
                        ELSE @param1 
                   END AND @param2 
    OR lon BETWEEN CASE WHEN @param1 > @param2 THEN @param1 
                        ELSE 181.0 
                   END AND 180.0

Для вашего примера (продольные границы 179.00 Для -179.00), это будет иметь тот же эффект, что и

SELECT * 
  FROM locations 
 WHERE lon BETWEEN -180.0 AND -179.0
    OR lon BETWEEN 179.0 AND 180.0

в то время как тот же запрос для перевернутого примера (продольные границы -179.00 Для 179.00) будет оценивать

SELECT * 
  FROM locations 
 WHERE lon BETWEEN -179.0 AND 179.0
    OR lon BETWEEN 181.0 AND 180.0 -- (always false)

Смотрите его в действии в этой бд<>fiddle (пример SQL Server)<>.

2021-11-19 15:43:38

Мне нравится, к чему это ведет - я думаю, что это хороший план для перевода в некоторый код, который мог бы генерировать SQL без предложения всегда ложно ИЛИ.
Dwight

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................