2013-10-23 2 views
0

약 11PM에서 8AM 사이에 실행되는 많은 작업의 실행 시간 레코드가 들어있는 데이터베이스 테이블을보고 있습니다. 일부 작업은 오전 12시 이전에 시작되고 끝납니다. 일부는 12AM 이후에 시작하고 끝납니다. 그리고 나머지는 오전 12시 이전에 시작되어 12시 이후에 끝납니다. 그래서 다소 흩어졌습니다.마지막 작업 실행에 해당하는 레코드 얻기

매일 해당 일에 해당하는 레코드는 이고 데이터베이스 테이블에는이 추가됩니다. 특정 작업이 완료되면 이후에 레코드가 으로 생성됩니다. 그래서, 1 레코드 = 1 특정 작업 1 실행.
테이블의 필드 중 일부는 작업 이름, 날짜 - 시간을 시작하고, 등

지금, 나는 마지막 날의 실행 모든 작업에 해당하는 기록을 인출 할 종료 날짜 - 시간. 따라서 특정 작업이 어제 밤에 실행 되었다면, 은 어제 전날의 기록을 원하지 않습니다. 또한 작업의 절반이 실행을 마쳤을 때 3시에 일어나면 현재 실행중인 레코드 만 원합니다.

어떻게 해결할 수 있습니까?

내가 지금까지 시도한 내용 :
많은 것들. 내가 시작한 마감은 시작일과 종료일이 현재 날짜의 1 일 이내인지 확인하는 것입니다. 그러나 그것은 또한 어제 실행을 완료 한 작업을 고려할 것입니다.
기본적으로 서로 다른 날짜의 작업이 포함되어 있으므로 논리를 파악할 수 없습니다.
사례 1 :

는 여기에 몇 가지 샘플 데이터의 모든 작업이 실행을 완료 한 후 22 분 아침에

TASK_NAME   START_DTTM    END_DTTM 
    TASK1   10/21/2013 11:21 PM 10/21/2013 11:58 PM 
    TASK2   10/21/2013 11:30 PM 10/22/2013 03:58 AM 
    TASK3   10/22/2013 12:33 AM 10/22/2013 07:58 AM 

쿼리 실행 : 작업이 어제 달렸다. 예상 결과 : 모든 작업.

사례 2 : 작업은 (예를 들어 테이블이 END_DTTM DESC로 정렬됩니다) 어제 실행되지 않은이

TASK_NAME   START_DTTM    END_DTTM 
    TASK1   10/21/2013 11:21 PM 10/21/2013 11:58 PM 
    TASK2   10/21/2013 11:30 PM 10/22/2013 03:58 AM 
    TASK3   10/22/2013 12:33 AM 10/22/2013 07:58 AM 

쿼리 10/23의 아침에서 실행된다.

사례 3 (NO 작업이 22 분 밤 & 10/23 이른 아침에에 실행하지 않기 때문에) 모든 작업 : 예상 결과 작업 실행 (테이블이 END_DTTM DESC으로 분류되는 말) :

TASK_NAME   START_DTTM    END_DTTM 
    TASK1   10/21/2013 11:21 PM 10/21/2013 11:58 PM 
    TASK2   10/21/2013 11:30 PM 10/22/2013 03:58 AM 
    TASK3   10/22/2013 12:33 AM 10/22/2013 07:58 AM 

오전 3시 22 분에 쿼리가 실행됩니다. 예상 결과 : TASK1
오전 10:22에 쿼리가 실행됩니다. 예상 결과 : TASK1, TASK2

추 신 : 레코드 수는 그리 크지 않기 때문에 성능에 큰 문제는 없습니다. 당신은 당신이 필요 명확히 한 후

+2

테이블 스키마와 일부 샘플 데이터 및 예상 결과를 제시하십시오. – OldProgrammer

+0

@OldProgrammer : Done .. – tumchaaditya

답변

1

이 좋아, 그것은 각 작업에 대한 start_date 최신 동일한 start_dttm이 레코드를 가져올 충분한 것 같다 작업이 완료된 경우에만,하지만 (나는 아니라고 작업을 가정 finished는 NULL이 end_dttm에 있음).

솔루션 : SQLFiddle에서

CREATE TABLE tasks (
    task_name VARCHAR2(20), 
    start_dttm DATE, 
    end_dttm DATE 
); 

INSERT INTO tasks VALUES ('TASK1', TO_DATE('10/21/2013 23:21', 'MM/DD/YYYY HH24:MI'), TO_DATE('10/21/2013 23:58', 'MM/DD/YYYY HH24:MI')); 
INSERT INTO tasks VALUES ('TASK2', TO_DATE('10/21/2013 23:30', 'MM/DD/YYYY HH24:MI'), TO_DATE('10/22/2013 03:58', 'MM/DD/YYYY HH24:MI')); 
INSERT INTO tasks VALUES ('TASK3', TO_DATE('10/22/2013 00:33', 'MM/DD/YYYY HH24:MI'), TO_DATE('10/22/2013 07:58', 'MM/DD/YYYY HH24:MI')); 

COMMIT; 

SELECT task_name, start_dttm, end_dttm 
    FROM tasks 
WHERE (task_name, start_dttm) IN (
         SELECT task_name, MAX(start_dttm) 
         FROM tasks 
         WHERE end_dttm IS NOT NULL 
         GROUP BY task_name 
) 
; 

확인 : SQLFiddle demo

+0

헤드 스타트 ​​주셔서 감사합니다 ...이 경우에는 사례 2를 고려하지 않을 것 같습니다. 내가 생각하기에, 나는 어떻게 든 당신이 SYSDATE를 사용한 장소에서 END_DTTM의 MAX 날짜를 사용해야합니다. – tumchaaditya

+0

@tumchaaditya 나는 ' 내 대답을 편집했습니다. –

+0

완료되지 않은 작업은 레코드가 없습니다 ... 작업이 완료된 후에 만 ​​생성 된 레코드 ... 해결 방법을 찾았습니다 .... 전체 작업이 시작되면 작업을 가져 와서 작업을 가져옵니다 그 dttm이 특수 레코드보다 더 시작했습니다 ... 비록 당신의 도움을 주셔서 감사합니다 ... – tumchaaditya