이번 포스팅은 [그림 1]과 같이 기간을 사용할 때 중복으로 등록할 수 없게 체크하는 방법에대해 포스팅 해보고자 합니다.
이 방법은 구현하는데 엄청나게 많은 고민 끝에 생각해낸 방법인데 너무 복잡하게 짜여진 구조가 아닌가 생각이 듭니다.
혹시 더 좋은 방법 있으신 분은 공유 부탁드립니다.

우선 조건은 이렇습니다.
1. 시작날짜만 입력한 경우 [ ex) 20200619 이후 ]
2. 종료날짜만 입력한 경우 [ ex) 20200619 이전 ]
3. 둘다 입력한 경우 [ ex) 20200601 ~ 20200619 ]
ㅡㅡ 1번 조건인 경우 종료날짜는 99991231로 넣어주고, 2번 조건은 10000101 값으로 넣어줍니다. ㅡㅡ
위 조건의 1번과 2번의 경우 현재 등록된 최소값과 최대값을 구한 후 등록된 값이 넘지는 않는지 체크해주면 됩니다.

Query ex) SELECT MIN(시작날짜) AS C
MAX(종료날짜) AS D
FROM 테이블명
WHERE 식별컬럼 = ? // 물음표는 등록할 값입니다.

이제 조건문을 통해 등록하려는 날짜가 등록된 최소,최대값 밖에 위치하는지 체크를 합니다.
if( MIN > 등록할 시작날짜 && MAX < 등록할 종료날짜) {
1번 쿼리 실행
} else {
2번 쿼리 실행
}
1번 Query)
SELECT COUNT(1)
FROM 테이블명
WHERE 식별컬럼 = ?
AND 시작날짜컬럼명 >= ?{시작}
AND 종료날짜컬럼명 <= ?{종료}
2번 Query)
SELECT COUNT(1)
FROM 테이블명
WHERE 식별컬럼 = ?
AND ((시작날짜 <= ?{시작} AND 종료날짜>= ?{시작}) OR (시작날짜<= ?{종료} AND 종료날짜>= ?{종료}))
1번 쿼리에 경우 둘다 입력한 경우인 3번조건인 경우 중복체크하는 쿼리입니다.
2번 쿼리에 경우 둘중 하나만 입력한 경우인 1,2번 조건을 중복체크하는 쿼리입니다.
여기까지 읽어주셔서 감사합니다.
'DataBase > Oracle' 카테고리의 다른 글
Oracle ] ANSI Join과 ORACLE Join (0) | 2022.02.08 |
---|---|
시퀀스(Sequence) NEXTVAL 과 MAX+1의 사용방법 및 차이 (0) | 2021.12.01 |
oracle, tibero ] WHERE IN 데이터 입력 순서대로 정렬하기 (0) | 2021.11.24 |