2014-10-28 7 views
0

이전 30 분 이내에 새 레코드를 찾는 쿼리를 실행하는 30 분마다 실행되는 스크립트가 있습니다. 실행중인 스크립트의 지연 유형을 설명하기 위해 이전 0 : 00-30 : 00 분 및 30 : 01-59 : 59 청크를 살펴보고 싶습니다.0-30 분 그룹의 데이터 쿼리

예를 들어, 내 스크립트 11:00시에 실행하는 경우, 나는

entered_date > 10:30 am AND < 11:00 am

을 가지고 그리고 그것은 오전 11시 30 분 실행했을 때, 내가 기대했던 새 행을 찾기를 기대 `entered_date> 11:00 am 및 < 오전 11:30 새 행.

내 스크립트가 어떻게 든 몇 초 지연, 및 11시 0분 2초에 달렸다 그래서 경우
SELECT 
    fa.entered_date, 
    fa.text 
FROM 
    form_answers fa 
WHERE 
    AND fa.value = 1 
    AND fa.entered_date >= DATEADD(mi, -30, GETDATE()) 

, 나는 잠재적으로 기록을 놓칠 수 : 이런 식으로 뭔가를하는

은 마지막 실행 30 분 도착 그 중 entered_date은 10:30:01입니다.

편집 :

이 나를 위해 일하게 끝난 것입니다 :

fa.entered_date BETWEEN 
     DATEADD(mi,-30,CONVERT(VARCHAR(19),DATEADD(mi, DATEDIFF(mi, 0, GETDATE())/30*30, 0))) 
    AND 
     DATEADD(mi, DATEDIFF(mi, 0, GETDATE())/30*30, 0) 

답변

0

"마지막"처리 시간을 추적하더라도 누락 된 레코드 또는 누락 된 레코드가 두 번 처리 될 수있는 경우에도 시간만으로 "새"레코드를 처리하는 확실한 방법은 없습니다.

일부 다른 방법 :

  • 처리 된 마지막 트랙 entered_date이며 이후 추가 것을 처리한다.
  • 처리 된 마지막 ID를 추적하고 ID가 더 높은 레코드를 처리합니다 (테이블에서 증가 키를 사용한다고 가정).
  • 레코드에 플래그 또는 상태 필드를 추가하여 처리 여부를 확인하십시오.
  • 레코드가 추가 될 때 (트리거 사용) 채워진 큐를 사용하고 주기적으로 처리하십시오. 당신이 혼자 시계에 의존해야 DO 경우

는, 나는 가장 가까운 30 분 간격으로 "현재"시간을 둥근 것 다시이 에서 30 분을 잠급니다. 따라서 현재 시간이 11:00:02이면 11:00:00으로 반올림하고 10:30:0011:00:00 사이에 추가 된 프로세스 레코드를 반올림합니다.

+0

나는 당신과 당신의 추적 방법에 대한 Gordon의 제안에 동의합니다. 그러나이 특정 데이터베이스에 데이터를 삽입 할 수 없으며 데이터 만 쿼리합니다. 그것은 정말로 시계 방법을 사용하여 나를 떠난다. "현재"시간을 가장 가까운 값으로 반올림 한 다음 반올림 한 시간에서 30 분 후에 되돌아 보는 예제를 제공 할 수 있습니까? – etm124

+0

당신의 제안으로, 나는 이것 같이 생각한다 : http://pastebin.com/SBeZTwKw – etm124

3

이 코멘트에 너무 깁니다.

스크립트의 시계 시간에 따라 나쁜 생각입니다. 스크립트가 다른 이유로 실행되지 않을 수 있습니다. 예를 들어 SQL Server 에이전트가 실행되고 있지 않거나 서버가 실행될 때 서버가 다시 부팅되거나 실수로 새 상자가 선택 취소됩니다. 또는 일부 기간에 두 번 실행될 수도 있습니다.

견고성을 원할 경우 스크립트를 마지막으로 실행 한 로그 테이블을 유지하십시오. 그런 다음 로그에서 다음과 같이 읽습니다.

select @lastlogtime = max(lastreadtime) 
from log; 

시계를 사용하는 대신 쿼리에서 사용하십시오.

+0

나는 시계 시간을 사용하는 것이 끔찍한 생각이라고 100 % 동의합니다. 그러나 스크립트가 실행될 때를 계속 추적하고 싶습니다. 그러나이 특정 데이터베이스에 데이터를 삽입 할 수 없습니다. 그냥 쿼리. – etm124

+0

@ etm124. . . 아마도 그러한 테이블에 대해 자체 데이터베이스를 가져와야합니다.이 경우 (다른 데이터베이스가 될 수 있습니다). 그것은 당신이 일을 할 수는 있지만 서버의 어느 곳에서든 권한을 쓰지 않는 이상한 구조로 보인다. 최후의 수단으로 이러한 정보를 파일에 보관할 수는 있지만 데이터베이스 작업을 실행하면이 정보는 왜곡됩니다. –