2012-01-10 2 views
0

저는 지금까지 성공하지 못한 채 몇 시간을 놀았습니다.MySQL 쿼리에서 Coldfusion DateDiff를 사용합니까?

매우 큰 쿼리를 출력하고 데이터를 처리하기 전에이를 청크로 분할하려고합니다. 이 쿼리는 기본적으로 매일 실행되며 동일한 데이터가 하루에 두 번 이상 처리되지 않도록하기 위해 필드 ('last_checked') 중 하나가 사용됩니다.

내 기존 검색어입니다.

<cfquery name="getprice" maxrows="100"> 
    SELECT ID, source, last_checked, price 
    FROM product_prices 
    WHERE source='api' 
    ORDER BY ID ASC 
</cfquery> 

그런 다음 cfoutput 쿼리를 실행하여 다양한 업데이트를 수행합니다. 이 테이블은 현재 100,000 개가 넘는 레코드를 보유하고 있으며, 한 번에 모든 것을 처리하기 위해 분투하기 시작했습니다. 따라서이를 덩어리로 나눌 필요가 있습니다.

내 의도는 매번 실행되도록 cfschedule하는 것입니다 (예를 들어 maxrows를 늘리고 15 분마다 실행하도록 설정). 그러나 지난 24 시간 내에 업데이트되지 않은 결과 만 반환해야합니다. 이것이 내가 막혀있는 곳입니다.

MySQL은 MySQL 자체의 DateDiff 및 TimeDiff 기능을 가지고 있지만 그 구문을 이해할 수있는 것 같지 않습니다. 실제로 내 용도에 해당하는 경우 (워드 프로세서는 이와 관련하여 스스로 모순되는 것처럼 보입니다. 적어도 내가 읽은 것).

모든 포인터는 대단히 감사하겠습니다!

답변

1

첫 MySQL과 연동이 시도 :

SELECT ID, source, last_checked, price 
    FROM product_prices 
    WHERE source='api' 
     AND last_checked >= current_timestamp - INTERVAL 24 HOUR 
    ORDER BY ID ASC 
+0

감사합니다. 에릭, 필자는 정확히 입력 한대로 붙여 넣었지만 구문 오류가 발생했습니다. INTERVAL을 처음 접한 적이 없으며, 이벤트를 만드는 것과 관련된 유일한 예를 찾을 수 있습니다. – Lee

+2

HOURS 대신 HOUR으로 변경해보십시오. –

+0

@ JakeFeasel - 감사합니다! – Eric

1

나는 당신이 당신의 cfquery 등의 maxrows=100를 사용에주의한다. 이렇게하면 전체 레코드 세트가 데이터베이스에서 CF로 반환되며, 그 다음에 만 CF가 처음 100 개의 레코드를 제외한 모든 레코드를 필터링합니다. 100,000 행 데이터 세트를 처리 할 때 이것은 엄청난 비용이 듭니다. 아마도 지난 24 시간 동안 만 필터를 사용하면 기본 결과 집합의 크기가 크게 줄어들 기 때문에 아마도 큰 문제는 아닙니다. 그러나 지난 24 시간 내에 변경된 세트로 세트를 제한하더라도 여전히 많은 레코드 세트를 사용할 수 있음을 알게되면이를 수행하는 방식을 훨씬 더 효율적으로 변경할 수 있습니다. 대신 결과를 필터링하는 CF를 사용하는 MySQL은 쿼리에서 LIMIT 키워드를 사용하여 할 수있다 :

또한 쉽게 LIMIT 전에 오프셋 값을 추가하여 100 행의 "페이지"사이에서 설정할 수

SELECT ID, source, last_checked, price 
    FROM product_prices 
    WHERE source='api' 
     AND last_checked >= current_timestamp - INTERVAL 1 DAY 
    ORDER BY ID ASC 
LIMIT 0,100 
: LIMIT 300, 100 결과 세트에서 행 300-400이됩니다. 이 방법으로 페이징을 수행하는 것은 CF로 오프로드하는 것보다 훨씬 빠릅니다.

+0

Jake에게 감사드립니다. 아주 좋은 점입니다. 저는 LIMIT를 더 자주 사용해야합니다! – Lee