2014-12-10 4 views
9

mysql 데이터베이스에서 지정한 datetime에 가장 가까운 datetime 값을 찾으려고하는데 문제가 있습니다. 이 밝혀 쿼리가,mysql 쿼리에서 지정한 datetime에 가장 가까운 datetime 찾기

답장 편집

덕분에 지금까지 사전에

SELECT one FROM table WHERE datetimefield is closest to "2014-12-10 09:45:00" LIMIT 1 

감사 :

다음 의사 코드는 내가 달성하고자하는 것입니다 원하는 결과를 얻으려고 처음 생각한 것보다 조금 더 복잡해졌지만, ABS 방법은 몇 가지 추가 작업으로 훌륭하게 작동합니다.

다음 질문은 어쨌든 다음 쿼리의 성능 요구 사항을 줄이려고합니까?

SELECT DISTINCT timegenerated, *other values* 
FROM table1 e INNER JOIN table2 dt 
ON e.circuit = dt.circuit 
WHERE dt.circuit IN ("2", "3", "4", "5", "6", "7", "8") 
AND e.circuit != 1 
AND dt.siteid = 435 
ORDER BY ABS(TIMESTAMPDIFF(MINUTE, timegenerated, "2014-12-09 14:15:00")) LIMIT 7 

또는 그것은 현재 다른 배열에서 각 날짜에 실행되고있다하지만 난이 실현 내가 여러 특정 날짜 시간 (아마도 최대 90 일)와 일치 할 수 있어야하므로 여러 날짜를 일치하도록 incorprate 최적이 아닙니다. 쿼리는 PHP에서 동적으로 생성됩니다.

쿼리 시간은 현재 쿼리 당 약 1.1 초이므로이 30 회 이상 실행하면 문제가 발생하므로 테이블에 수십만 개의 행이 있습니다.

다시 한 번 감사드립니다. 당신이 가장 가까운 일 전에 원하는 경우

:

답변

23

의 핵심 아이디어는 order bylimit을 사용하는 것입니다 당신이 어느 방향에서 가장 가까운을 원하는 경우에

SELECT one 
FROM table 
WHERE datetimefield <= '2014-12-10 09:45:00' 
ORDER BY datetimefield DESC 
LIMIT 1; 

, 다음 사용 TIMESTAMPDIFF() :

ORDER BY abs(TIMESTAMPDIFF(second, datetimefield, '2014-12-10 09:45:00')) 
LIMIT 1 
+0

감사합니다, 내가 업데이트 한 OP는 작동하는 업데이트 된 쿼리로 작동하지만 성능면에서 매우 중요합니다. 빛이 좀 비춰지면 –

+1

@ JackHayfield. . . 편집 된 부분은이 질문에 대한 부록이 아닌 다른 질문이어야합니다. –

4
SELECT one FROM table 
ORDER BY ABS(`datetimefield` - '2014-12-10 09:45:00') LIMIT 1 

이렇게하면 차이가 가장 가깝거나 가까운 행이 반환됩니다.

3

abs()를 사용하면 datetimefield 인덱스를 사용할 수 없습니다. 내가 하나가 이전에 가장 가까운 이후 가장 가까운 하나를 선택해서, 모두 인덱스를 사용하고 이후 그들의 가장 가까운 따기 선택하도록 제안이에 대한

create table `table` (datetimefield datetime key, one varchar(99)); 
insert into `table` values 
    ('2014-06-01', 'a'), ('2014-12-01', 'b'), 
    ('2015-01-01', 'c'), ('2015-02-01', 'd'); 

set @d = '2014-12-10 09:45:00'; 

select * from 
(
    (select *, TIMESTAMPDIFF(SECOND, @d, datetimefield) as diff 
    from `table` where datetimefield >= @d 
    order by datetimefield asc limit 1 
) 
    union 
    (select *, TIMESTAMPDIFF(SECOND, datetimefield, @d) as diff 
    from `table` where datetimefield < @d 
    order by datetimefield desc limit 1 
) 
) x 
order by diff 
limit 1; 

http://sqlfiddle.com/#!2/bddb4/1

+0

당신은 그것을 더 복잡하게 만들고 있습니다. –

+1

더 나은 성능이라면 더 복잡한 것은 반드시 나쁜 것이 아닙니다 ... 그의 포스트의 요점입니다. – thaspius