2011-09-19 4 views
1

제목을 잘못 쓰는 방법을 확실히 알지 못했습니다. 일부 시작 및 일정 시간을 데이터베이스에로드하려고 시도하지만 때로는 같은 시스템에 대한 시작 및 중지 시간이 중복되어 같은 시간에 5:30 to 12:30 일 수 있으며 동일한 시스템에 대한 다른 시간은 8:30 to 10:30 일 수 있습니다. 삽입을 피하고 싶습니다. 그 데이터를 테이블에 저장하십시오.jdbc-odbc를 사용하여 충돌하는 행을 삭제하십시오.

jdbc 및 odbc 브리지를 사용하여 Java 프로그램에서이 작업을 모두 수행합니다. 사용자가 생성 일정을 클릭하면 텍스트 파일에서 모든 일정 정보를 읽은 다음 데이터베이스에 삽입합니다. 프로그램이 이미 존재하는 시간 사이에있는 시간을 읽었을 때 나는 삽입하는 것을 건너 뛰고 싶습니다.

내 아이디어 그래서 내가 데이터베이스에서 시간의 최대 값을 가진 텍스트 파일에서 얻을 수있는 끝 시간을 비교하고 그 값보다 작 으면이 삽입을 건너 뛸 수 있지만 어떻게 해야할지 모르겠다. MAX 값을 if 문에 연결하십시오. 또 다른 아이디어는 모든 삽입이 완료된 후 SCHEDULE_TIME 열이 SCHEDULE_TIME 열의 최소값보다 크고 SCHEDULE_TIMESCHEDULE_TIME 열의 최대 값보다 작은 행을 삭제하는 것입니다.

SITE_ID ------- DEV_ID ------- SCHEDULE_TIME ------- VALUE_ENUM 
--------------------------------------------------------------- 
1    3000   09:30:00    1 
1    3000   15:30:00    0 
1    3000   12:30:00    1 
1    3000   13:30:00    0 
1    3000   16:30:00    1 
1    3000   18:30:00    0 

시작 상단의 행의 다른 시간 VALUE_ENUM이 1 시간과 모든 행 VALUE_ENUM를 시작할 수 있습니다 모든 행을 중지하려면 여기

처럼 내 테이블의 데이터 모습의 예입니다 0은 정지 시간입니다. 이 경우에는 다른 시작과 중지 시간 사이에있는 시간을 삭제하려고하는데 3 번과 4 번 행을 삭제하십시오. 실제로이 테이블은 텍스트 파일에서 수백 개의 행을 생성하므로 수동으로 삭제할 수는 없습니다. 내가 그것을 삽입하는 것을 피할 수있는 방법을 찾을 수 있다면 가장 좋습니다.

여기에 현재 삽입 방법의 복사본이 있습니다. 사용하는 모든 여분의 열을 무시합니다. 문제와 관련이 없으며 올바른 시스템을 추가하고 삭제하기 때문에 사용하고 있습니다.

private void Insert() throws SQLException 
{ 
    stmt = conn.createStatement(); 

    String sqlStm = "update ARRAY_BAC_SCH_Schedule set SCHEDULE_TIME = {t '" + finalEnd + "'} WHERE SCHEDULE_TIME >= {t '" + finalStart + "'} AND" + 
     " SCHEDULE_TIME <= {t '" + finalEnd + "'} AND VALUE_ENUM = 0 AND DEV_ID = " + devID + " and INSTANCE = " + instanceNum; 
    int updateSuccess = stmt.executeUpdate(sqlStm); 

    if (updateSuccess < 1) 
    { 

     sqlStm = "insert into ARRAY_BAC_SCH_Schedule (SITE_ID, DEV_ID, INSTANCE, DAY, SCHEDULE_TIME, VALUE_ENUM, Value_Type) " + 
       " values (1, " + devID + ", " + instanceNum + ", " + day + ", {t '" + finalStart + "'}, 1, 'Unsupported')"; 
     stmt.executeUpdate(sqlStm); 
     sqlStm = "insert into ARRAY_BAC_SCH_Schedule (SITE_ID, DEV_ID, INSTANCE, DAY, SCHEDULE_TIME, VALUE_ENUM, Value_Type) " + 
       " values (1," + devID + ", " + instanceNum + ", " + day + ", {t '" + finalEnd + "'}, 0, 'Unsupported')"; 
     stmt.executeUpdate(sqlStm); 
    } 


    if(stmt!=null) 
     stmt.close(); 
} 

내가 충분히 설명했으면 좋겠다. 질문이 불분명하면 죄송합니다.

나는이 질문을 sql 태그로 게시하여 누군가가 SQL으로이를 수행하는 방법을 알고 있는지 확인합니다.

업데이트 : 나는 입력하고 내가 확인이 새로운 시간을 입력 갈 때 다음 새 시작 시간 이었다는 것을 확인하기 위해 마지막 시작 시간과 종료 시간을 복용하기 전에 작업을했다> = 이전과 그 새로운 종료 시간 < = 이전 종료 시간. 만약 그렇다면 삽입을 건너 뜁니다.

그러나 이전의 시작/종료 시간을 더 이상 얻을 수없는 프로그램을 약간 변경해야했습니다. 이제 테이블에서 마지막 두 번을 선택하여 변수에 저장하면됩니다. 자바 쪽 그리고 나서 내가 전에했던 동일한 비교를 할

+0

사용할 범위를 어떻게 결정했는지 어떻게 알 수 있습니까? 예를 들어 9:30 ~ 15:30 (1 행, 2 행)이 예제였습니다. 하지만 9시 30 분에서 13시 30 분 (line1, line4)이 될 수 있습니까? –

+0

@AlfredoO 그렇습니다. 예를 들어'9:30 to 13 : 30'이 될 수는 있지만,'12:30 to 13:30'은 제 함수의'update'가 성공할 것이므로'updateSuccess'가 1 그래서'insert' 문을 입력하는'if' 문을 입력하지 않을 것입니다. 여러분의 질문에 대답 한 희망이 – Beef

+0

바로 처리하는 순서가 맞습니까? –

답변

0

도움을 주셔서 감사합니다,하지만 난 그냥 시간에 :에 대체 문자열을하고 결국하고 .로를 만든 다음 double로 변환 임시 변수에 시간을 저장하고 다음 시간 I 해당 시스템에 대한 시간이있었습니다. 시작 시간이 마지막 시작 시간보다 크고 종료 시간이 마지막 시간보다 작 으면 넘어지면 100 % 테스트하지 않고 추가하는 것을 피할 수 있지만 첫 번째 시스템에서는 효과가있었습니다 시도 했음

1

나는 문제가 디자인과 같다고 생각한다. 텍스트 파일이 주문에 의존하고 있다면 데이터베이스에 저장하지 말아야합니다.

정보를 하나의 레코드에 저장했을 것입니다. 예를 들어 데이터베이스에 VALUE_ENUM 및 두 개의 레코드가있는 대신 START_SCHEDULE_TIME 및 END_SCHEDULE_TIME 필드가있는 레코드가 하나만 필요합니다.이제 디자인 당신은 단지 선택과 같이 할 수있는 :

SELECT COUNT (*)를 ARRAY_BAC_SCH_Schedule 어디에서 finalStart> = START_SCHEDULE_TIME 및 finalEnd < = END_SCHEDULE_TIME

경우 선택을 반환 한 다음을 건너 뛰고 삽입하지 마십시오.

+0

고마워요,하지만 데이터베이스의 디자인을 제어 할 권한이 없습니다. – Beef

+0

나는 여러 가지 시작과 스케줄을 가지고 있기 때문에 SCHEDULE_TIME의 <= min과 SCHEDULE_TIME의 <= max를 삭제할 수 없다는 것을 알게되었다. '8:30 to 10 : 30'과 같은 데이터를 삭제할 것이다. 12 시부 터 14 시까 지 '12 : 00 ~ 13 : 00'까지 계속 유지할 필요가 있지만 '8 : 30'과 '14 : 00'사이의 모든 시간이 지워지므로 '11 시부 터 14시' 30'과'11 : 00' – Beef

+0

그 행을 따라 뭔가가 필요하지만 그 행들이 존재하지 않기 때문에'START_SCHEDULE_TIME'과'END_SCHEDULE_TIME'을 얻는 대신'dev_id == 3000' 테이블의 마지막 값을 가져와야합니다. 테이블에서 두 번째 마지막 값'dev_id == 3000'이며 내 응용 프로그램의 Java 측에서 해당 값을 사용할 수 있습니다. – Beef

1

문제 영역이 두 개 이상의 연속 시작 시간으로 특징 지거나 식별된다고 말하는 것이 합리적입니까? 나는 그것이 의심 스럽다.

그렇다면 테이블에있는 모든 것을로드 한 다음 시간 순서대로 테이블을 구문 분석하십시오. 2 회 연속으로 시작될 때마다 '이'시작/끝 쌍을 삭제해야합니다.

물론 연속으로 3 번째 시작 시간이 발생하면 2 번 종료 시간을 삭제해야한다는 것을 알고 있습니다. 그래서 의사의

- 데이터 세트가 Dev_Id, schedule_time에 의해 정렬됩니다 value_enum 내림차순

int NestCount = 0; 
int CurrDevId = 0; 

for each record 
{ 

    // Optional DevId Logic Starts Here 
    if ThisRecord.DevId <> CurrDevId then 
    { 
     if NestCount <> 0 
     { 
     CurrDevId = 0; 
     RollBack; 
     Shriek("Cannot Proceed Because The Data Are Fubar"); 
     } 
     else 
     { 
     CurrDevId = ThisRecord.DevId; 
     } 
    } // And Ends Here 

    if 
    CurrDevId <> 0 && // Optional DevId Logic 
    IsAStartRecord() 
    { 
     If NestCount > 0 
     { 
     DeleteThisRecord(); 
     } 
     NestCount += 1;  
    } 
    else // Is an end record 
    { 
     NestCount -= 1; 
     If NestCount > 0 
     { 
     DeleteThisRecord(); 
     } 
    } 
} 

이 아마 것 저장 프로 시저로이를 구현 할 수 있다면

.

도움이 되었습니까?

+0

종료 시간과 다음 시작 시간이있을 수있는 환경이있을 것이라고 생각한 적이 있습니까? 같은.이것은 올바른 정렬 순서를 보장함으로써 해결 될 것입니다. value_enum desc –

+0

DEV_ID는 각 시스템에 대한 문제이므로 각 시스템마다 별도의 일정이 있습니다. 따라서 나의 예에서는 하나의 DEV_ID 만 볼 수 있지만 실제로는 나타날 것입니다. 거기에 수백 DEV_IDs, 그래서 만약 내가 일정 시간에 다음 특정 시간과 함께 모든 DEV_ID 함께 그룹화 될 수 있도록 내가 잘못 행을 삭제 최대 결국 수 – Beef

+0

그런 다음 dev_id, schedule_time, value_enum desc에 의해 순서. 저는 여러분의 데이터가 이미 '깨끗한'것으로 가정 했으므로 알고리즘은 '있는 그대로'작동합니다. 그러나 NestCounter는 추가 검사로 각 dev_id에 대해 항상 0으로 돌아 가야한다는 사실을 사용할 수 있습니다. 나는 이것을 고려하여 의사 코드를 수정할 것입니다. –

관련 문제