범위 SQL 경계 상자의 날짜

0

질문

내가 노력하는 범위 내 쿼리를 선택하는 위치에서 경계 상자의 위도/경도. 일반적으로 이어 경계 상자 교차하지 않으니까.

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

그러나 만약에 나 경계 상자를 십자가 국제 날짜 선 말을 길이 방향의 범위 179.00 하기 -179.00 다음 쿼리 결과를 반환하지 않습니다. 수은 단지 뒤집기 위해 변경 사 -179.00179.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)

액션에서 볼에 이 db<>바이올린(SQL Server 예).

2021-11-19 15:43:38

나는 어디에이고-나는 그것의 좋은 청사진으로 번역 코드를 생성할 수 있는 SQL 없이 항상 거짓 또는 절이 있습니다.
Dwight

다른 언어로

이 페이지는 다른 언어로되어 있습니다

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................