표류 병 푸 시 수요 의 논리 적 실현 코드

2703 단어 표류 병논리학
자체 이 두 데이터 간 에는 관련 이 없 으 며,sql 구문 의 정렬 규칙 은 요 구 를 만족 시 킬 수 없습니다.sql 에 서 는 데이터 중의 이전 정렬 조건 이 같은 상황 이 나타 날 때 만 뒤의 정렬 조건 을 고려 합 니 다.실제 상황 은 먼저 푸 시 시간 후 거리 에 따라 정렬 하면 거리 가 작용 하지 못 하고 반대로 두 데이터 가 연결 되도록 해 야 합 니 다.한 가지 방법 은 이 두 데 이 터 를 덧셈 이나 뺄셈 으로 정렬 하 는 것 이다.그러나 이것 은 다음 과 같은 상황 을 고려 해 야 한다.두 데이터 의 데이터 유형 이 일치 하지 않 는 다.하 나 는 날짜 유형 이 고 다른 하 나 는 두 데이터 의 정렬 방향 을 통일 시 켜 야 한다.시간 을 보 내 고 거 리 를 바 꾸 어 실제 수요 에 따라 이 두 데 이 터 를 모두 하나의 유형 으로 바 꿔 야 한다.하나의 계수 가 그것들 을 균형 시 켜 야 합 니 다.만약 에 하나의 데이터 수량 이 매우 크 고 다른 데이터 수량 이 매우 적다 면 아주 작은 데이터 가 아무리 변화 하 더 라 도 큰 데이터 에 미 치 는 영향 은 아래 를 무시 하고 구체 적 으로 실현 할 수 있 습 니 다.먼저 날짜 유형 을 쌍 정밀도 유형 으로 바 꾸 고 두 가지 수치 유형의 데 이 터 를 조작 하 는 것 이 상대 적 으로 쉽 습 니 다.my sql 안에 이런 함수 가 있 습 니 다:유 닉 스timestamp(date)-내부 로 직접 돌아 갈 때 스탬프 값
 
--
select unix_timestamp('2010-12-13') - unix_timestamp('2010-12-12')
-- :86400
이미 알 고 있 는 두 지역 의 위도 계산 거리 에 관 한 공식 에 대해 인터넷 에서 하 나 를 검색 하 였 으 며,계산 결 과 는 만 족 스 러 운 편 이다
 
ROUND((2 * ASIN(SQRT(POWER(SIN(((LAT*PI()/180.0)-(plat*PI()/180.0)) / 2), 2) + COS(LAT*PI()/180.0) * COS(plat*PI()/180.0) * POWER(SIN((LNG*PI()/180.0-plng*PI()/180.0) / 2), 2))))*6378.137*10000,3)/10000)
그 다음 에 두 데이터 의 정렬 방향 을 고려 하여 우리 가 원 하 는 것 은 지난번 푸 시 시간 이 길 수록 좋다 는 것 이다.사용자 와 의 거리 가 가 까 울 수록 좋 습 니 다.시간 이 길 수록 계 산 된 차 이 는 커 집 니 다.두 데 이 터 를 직접 더 하면 안 됩 니 다.여 기 는 시간 을 마이너스 로 해서 사용자 와 의 거리 가 가 까 울 수록 좋 은 요 구 를 만족 시 킨 다음 에 정렬 할 수 밖 에 없습니다.다시 이 두 수 를 같은 수량 급 에 두 고 데이터 테스트 에 따라 시간 은 초 이 고 거 리 는 킬로미터 입 니 다.직접 거 리 를 하나의 계수(1000)에 곱 하여 미터 로 환산 하여 두 자 를 균형 시 킵 니 다.최종 푸 시 문 구 는 다음 과 같 습 니 다
 
select BottleID,(ROUND((2 * ASIN(SQRT(POWER(SIN(((LAT*PI()/180.0)-(plat*PI()/180.0)) / 2), 2) + COS(LAT*PI()/180.0) * COS(plat*PI()/180.0) * POWER(SIN((LNG*PI()/180.0-plng*PI()/180.0) / 2), 2))))*6378.137*10000,3)/10000)as Distance from Bottle
inner join Venue_Mapabc
on Bottle.VenueID = Venue_Mapabc.VenueID
where Bottle.IsDrift =1 and Bottle.IsEmpty =1 and IsFinished=0 and Venue_Mapabc.City = pCity
-- and (ROUND((2 * ASIN(SQRT(POWER(SIN(((LAT*PI()/180.0)-(plat*PI()/180.0)) / 2), 2) + COS(LAT*PI()/180.0) * COS(plat*PI()/180.0) * POWER(SIN((LNG*PI()/180.0-plng*PI()/180.0) / 2), 2))))*6378.137*10000,3)/10000)>1.5
order by

(-(unix_timestamp(now())-unix_timestamp(Bottle.PlaceTime))*0.5 +
(ROUND((2 * ASIN(SQRT(POWER(SIN(((LAT*PI()/180.0)-(plat*PI()/180.0)) / 2), 2) + COS(LAT*PI()/180.0) * COS(plat*PI()/180.0) * POWER(SIN((LNG*PI()/180.0-plng*PI()/180.0) / 2), 2))))*6378.137*10000,3)/10000)*0.5*1000)


limit 1;
전단 캡 처:

좋은 웹페이지 즐겨찾기